ReflectionSerializationHolder.cs 2.5 KB

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