2 // System.Xml.Serialization.ReflectionHelper
5 // Lluis Sanchez Gual (lluis@ximian.com)
7 // Copyright (C) 2003 Ximian, Inc.
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System
.Reflection
;
32 using System
.Collections
;
34 namespace System
.Xml
.Serialization
36 internal class ReflectionHelper
38 Hashtable _clrTypes
= new Hashtable ();
39 Hashtable _schemaTypes
= new Hashtable ();
41 public void RegisterSchemaType (XmlTypeMapping map
, string xmlType
, string ns
)
43 string mapKey
= xmlType
+ "/" + ns
;
44 if (!_schemaTypes
.ContainsKey (mapKey
))
45 _schemaTypes
.Add (mapKey
, map
);
48 public XmlTypeMapping
GetRegisteredSchemaType (string xmlType
, string ns
)
50 string mapKey
= xmlType
+ "/" + ns
;
51 return _schemaTypes
[mapKey
] as XmlTypeMapping
;
54 public void RegisterClrType (XmlTypeMapping map
, Type type
, string ns
)
56 if (type
== typeof(object)) ns
= "";
57 string mapKey
= type
.FullName
+ "/" + ns
;
58 if (!_clrTypes
.ContainsKey (mapKey
))
59 _clrTypes
.Add (mapKey
, map
);
62 public XmlTypeMapping
GetRegisteredClrType (Type type
, string ns
)
64 if (type
== typeof(object)) ns
= "";
65 string mapKey
= type
.FullName
+ "/" + ns
;
66 return _clrTypes
[mapKey
] as XmlTypeMapping
;
69 public Exception
CreateError (XmlTypeMapping map
, string message
)
71 return new InvalidOperationException ("There was an error reflecting '" + map
.TypeFullName
+ "': " + message
);
74 public static void CheckSerializableType (Type type
, bool allowPrivateConstructors
)
76 if (type
.IsArray
) return;
78 if (!allowPrivateConstructors
&& type
.GetConstructor (Type
.EmptyTypes
) == null && !type
.IsAbstract
&& !type
.IsValueType
)
79 throw new InvalidOperationException (type
.FullName
+ " cannot be serialized because it does not have a default public constructor");
82 throw new InvalidOperationException (type
.FullName
+ " cannot be serialized because it is an interface");
86 if (!t
.IsPublic
&& !t
.IsNestedPublic
)
87 throw new InvalidOperationException (type
.FullName
+ " is inaccessible due to its protection level. Only public types can be processed");
93 public static string BuildMapKey (Type type
)
95 return type
.FullName
+ "::";
98 public static string BuildMapKey (MethodInfo method
, string tag
)
100 string res
= method
.DeclaringType
.FullName
+ ":" + method
.ReturnType
.FullName
+ " " + method
.Name
+ "(";
102 ParameterInfo
[] pars
= method
.GetParameters ();
104 for (int n
=0; n
<pars
.Length
; n
++)
106 if (n
> 0) res
+= ", ";
107 res
+= pars
[n
].ParameterType
.FullName
;