New tests.
[mono.git] / mcs / class / System.Xaml / System.Xaml.Schema / XamlTypeInvoker.cs
1 //
2 // Copyright (C) 2010 Novell Inc. http://novell.com
3 //
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:
11 // 
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
14 // 
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.
22 //
23 using System;
24 using System.Collections;
25 using System.Collections.Generic;
26 using System.Reflection;
27 using System.Windows.Markup;
28
29 namespace System.Xaml.Schema
30 {
31         public class XamlTypeInvoker
32         {
33                 public static XamlTypeInvoker UnknownInvoker {
34                         get { throw new NotImplementedException (); }
35                 }
36
37                 protected XamlTypeInvoker ()
38                 {
39                 }
40                 
41                 public XamlTypeInvoker (XamlType type)
42                 {
43                         if (type == null)
44                                 throw new ArgumentNullException ("type");
45                         this.type = type;
46                 }
47                 
48                 XamlType type;
49
50                 void ThrowIfUnknown ()
51                 {
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));
54                 }
55
56                 public EventHandler<XamlSetMarkupExtensionEventArgs> SetMarkupExtensionHandler {
57                         get { return type.SetMarkupExtensionHandler; }
58                 }
59
60                 public EventHandler<XamlSetTypeConverterEventArgs> SetTypeConverterHandler {
61                         get { return type.SetTypeConverterHandler; }
62                 }
63
64                 public virtual void AddToCollection (object instance, object item)
65                 {
66                         if (instance == null)
67                                 throw new ArgumentNullException ("instance");
68
69                         var t = instance.GetType ();
70                         MethodInfo mi;
71                         if (t.IsGenericType)
72                                 mi = instance.GetType ().GetMethod ("Add", t.GetGenericArguments ());
73                         else
74                                 mi = instance.GetType ().GetMethod ("Add", new Type [] {typeof (object)});
75                         if (mi == null)
76                                 throw new InvalidOperationException (String.Format ("The collection type '{0}' does not have 'Add' method", t));
77                         mi.Invoke (instance, new object [] {item});
78                 }
79
80                 public virtual void AddToDictionary (object instance, object key, object item)
81                 {
82                         if (instance == null)
83                                 throw new ArgumentNullException ("instance");
84
85                         var t = instance.GetType ();
86                         if (t.IsGenericType)
87                                 instance.GetType ().GetMethod ("Add", t.GetGenericArguments ()).Invoke (instance, new object [] {key, item});
88                         else
89                                 instance.GetType ().GetMethod ("Add", new Type [] {typeof (object), typeof (object)}).Invoke (instance, new object [] {key, item});
90                 }
91
92                 public virtual object CreateInstance (object [] arguments)
93                 {
94                         ThrowIfUnknown ();
95                         return Activator.CreateInstance (type.UnderlyingType, arguments);
96                 }
97
98                 public virtual MethodInfo GetAddMethod (XamlType contentType)
99                 {
100                         throw new NotImplementedException ();
101                 }
102                 public virtual MethodInfo GetEnumeratorMethod ()
103                 {
104                         throw new NotImplementedException ();
105                 }
106                 public virtual IEnumerator GetItems (object instance)
107                 {
108                         throw new NotImplementedException ();
109                 }
110         }
111 }