2 // Copyright (C) 2010 Novell Inc. http://novell.com
4 // Permission is hereby granted, free of charge, to any person obtaining
5 // a copy of this software and associated documentation files (the
6 // "Software"), to deal in the Software without restriction, including
7 // without limitation the rights to use, copy, modify, merge, publish,
8 // distribute, sublicense, and/or sell copies of the Software, and to
9 // permit persons to whom the Software is furnished to do so, subject to
10 // the following conditions:
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 using System.Collections;
25 using System.Collections.Generic;
26 using System.Reflection;
27 using System.Windows.Markup;
29 namespace System.Xaml.Schema
31 public class XamlTypeInvoker
33 public static XamlTypeInvoker UnknownInvoker {
34 get { throw new NotImplementedException (); }
37 protected XamlTypeInvoker ()
41 public XamlTypeInvoker (XamlType type)
44 throw new ArgumentNullException ("type");
50 void ThrowIfUnknown ()
52 if (type.UnderlyingType == null)
53 throw new InvalidOperationException (String.Format ("Current operation is valid only when the underlying type on a XamlType is known, but it is unknown for '{0}'", type));
56 public EventHandler<XamlSetMarkupExtensionEventArgs> SetMarkupExtensionHandler {
57 get { return type.SetMarkupExtensionHandler; }
60 public EventHandler<XamlSetTypeConverterEventArgs> SetTypeConverterHandler {
61 get { return type.SetTypeConverterHandler; }
64 public virtual void AddToCollection (object instance, object item)
67 throw new ArgumentNullException ("instance");
69 var t = instance.GetType ();
72 mi = instance.GetType ().GetMethod ("Add", t.GetGenericArguments ());
74 mi = instance.GetType ().GetMethod ("Add", new Type [] {typeof (object)});
76 throw new InvalidOperationException (String.Format ("The collection type '{0}' does not have 'Add' method", t));
77 mi.Invoke (instance, new object [] {item});
80 public virtual void AddToDictionary (object instance, object key, object item)
83 throw new ArgumentNullException ("instance");
85 var t = instance.GetType ();
87 instance.GetType ().GetMethod ("Add", t.GetGenericArguments ()).Invoke (instance, new object [] {key, item});
89 instance.GetType ().GetMethod ("Add", new Type [] {typeof (object), typeof (object)}).Invoke (instance, new object [] {key, item});
92 public virtual object CreateInstance (object [] arguments)
95 return Activator.CreateInstance (type.UnderlyingType, arguments);
98 public virtual MethodInfo GetAddMethod (XamlType contentType)
100 throw new NotImplementedException ();
102 public virtual MethodInfo GetEnumeratorMethod ()
104 throw new NotImplementedException ();
106 public virtual IEnumerator GetItems (object instance)
108 throw new NotImplementedException ();