2004-02-12 Martin Baulig <martin@ximian.com>
[mono.git] / mcs / class / corlib / System.Reflection / ReflectionSerializationHolder.cs
1 // ReflectionSerializationHolder.cs.cs
2 //
3 // Author:
4 //  Patrik Torstensson
5 //
6 // (C) 2003 Patrik Torstensson
7 \r
8 using System;\r
9 using System.Runtime.Serialization;\r
10 \r
11 namespace System.Reflection\r
12 {\r
13         [Serializable]\r
14         internal class ReflectionSerializationHolder : IObjectReference, ISerializable\r
15         {\r
16                 string          _memberName;\r
17                 string          _memberSignature;\r
18                 MemberTypes     _memberType;\r
19                 Type            _reflectedType;\r
20 \r
21                 ReflectionSerializationHolder(SerializationInfo info, StreamingContext ctx)\r
22                 {\r
23                         string assemblyName;\r
24                         string typeName;\r
25 \r
26                         assemblyName = info.GetString("AssemblyName");\r
27                         typeName = info.GetString("ClassName");\r
28 \r
29                         _memberName = info.GetString("Name");\r
30                         _memberSignature = info.GetString("Signature");\r
31                         _memberType = (MemberTypes) info.GetInt32("MemberType");\r
32 \r
33                         // Load type\r
34                         Assembly asm = Assembly.Load(assemblyName);\r
35 \r
36                         _reflectedType = asm.GetType(typeName, true, true);\r
37                 }\r
38 \r
39                 public static void Serialize(SerializationInfo info, String name, Type klass, String signature, MemberTypes type)\r
40                 {\r
41                         info.SetType( typeof(ReflectionSerializationHolder));\r
42 \r
43                         info.AddValue("AssemblyName", klass.Module.Assembly.FullName, typeof(String));\r
44                         info.AddValue("ClassName", klass.FullName, typeof(String));\r
45 \r
46                         info.AddValue("Name", name, typeof(String));\r
47                         info.AddValue("Signature", signature, typeof(String));\r
48                         info.AddValue("MemberType",(int)type);\r
49                 }\r
50 \r
51                 public void GetObjectData(SerializationInfo info, StreamingContext context)\r
52                 {\r
53                         throw new NotSupportedException();\r
54                 }\r
55 \r
56                 public object GetRealObject(StreamingContext context)\r
57                 {\r
58                         switch (_memberType) \r
59                         {\r
60                                 case MemberTypes.Constructor:\r
61                                         ConstructorInfo [] ctors;\r
62 \r
63                                         ctors = _reflectedType.GetConstructors (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);\r
64                                         for (int i = 0; i < ctors.Length; i++) \r
65                                                 if ( ctors[i].ToString().Equals(_memberSignature)) \r
66                                                         return ctors[i];\r
67 \r
68                                         throw new SerializationException("Failed to find serialized constructor");\r
69 \r
70                                 case MemberTypes.Method:\r
71                                         MethodInfo [] methods;\r
72 \r
73                                         methods = _reflectedType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);\r
74                                         for (int i = 0; i < methods.Length; i++) \r
75                                                 if ((methods[i]).ToString().Equals(_memberSignature)) \r
76                                                         return methods[i];\r
77 \r
78                                         throw new SerializationException("Failed to find serialized method");\r
79                                 default:\r
80                                         throw new SerializationException("Failed to get object for member type " + _memberType.ToString());\r
81                         }\r
82                 }\r
83         }\r
84 }\r