1 // ReflectionSerializationHolder.cs.cs
6 // (C) 2003 Patrik Torstensson
9 using System.Runtime.Serialization;
\r
11 namespace System.Reflection
\r
14 internal class ReflectionSerializationHolder : IObjectReference, ISerializable
\r
17 string _memberSignature;
\r
18 MemberTypes _memberType;
\r
19 Type _reflectedType;
\r
21 ReflectionSerializationHolder(SerializationInfo info, StreamingContext ctx)
\r
23 string assemblyName;
\r
26 assemblyName = info.GetString("AssemblyName");
\r
27 typeName = info.GetString("ClassName");
\r
29 _memberName = info.GetString("Name");
\r
30 _memberSignature = info.GetString("Signature");
\r
31 _memberType = (MemberTypes) info.GetInt32("MemberType");
\r
34 Assembly asm = Assembly.Load(assemblyName);
\r
36 _reflectedType = asm.GetType(typeName, true, true);
\r
39 public static void Serialize(SerializationInfo info, String name, Type klass, String signature, MemberTypes type)
\r
41 info.SetType( typeof(ReflectionSerializationHolder));
\r
43 info.AddValue("AssemblyName", klass.Module.Assembly.FullName, typeof(String));
\r
44 info.AddValue("ClassName", klass.FullName, typeof(String));
\r
46 info.AddValue("Name", name, typeof(String));
\r
47 info.AddValue("Signature", signature, typeof(String));
\r
48 info.AddValue("MemberType",(int)type);
\r
51 public void GetObjectData(SerializationInfo info, StreamingContext context)
\r
53 throw new NotSupportedException();
\r
56 public object GetRealObject(StreamingContext context)
\r
58 switch (_memberType)
\r
60 case MemberTypes.Constructor:
\r
61 ConstructorInfo [] ctors;
\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
68 throw new SerializationException("Failed to find serialized constructor");
\r
70 case MemberTypes.Method:
\r
71 MethodInfo [] methods;
\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
78 throw new SerializationException("Failed to find serialized method");
\r
80 throw new SerializationException("Failed to get object for member type " + _memberType.ToString());
\r