The Labs \ Source Viewer \ SSCLI \ System.Reflection \ MemberInfoSerializationHolder

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. using System;
  16. using System.Runtime.Remoting;
  17. using System.Runtime.Serialization;
  18. using System.Globalization;
  19. namespace System.Reflection
  20. {
  21.     [Serializable()]
  22.     internal class MemberInfoSerializationHolder : ISerializable, IObjectReference
  23.     {
  24.         #region Staitc Public Members
  25.         public static void GetSerializationInfo(SerializationInfo info, string name, Type reflectedClass, string signature, MemberTypes type)
  26.         {
  27.             GetSerializationInfo(info, name, reflectedClass, signature, type, null);
  28.         }
  29.        
  30.         public static void GetSerializationInfo(SerializationInfo info, string name, Type reflectedClass, string signature, MemberTypes type, Type[] genericArguments)
  31.         {
  32.             if (info == null)
  33.                 throw new ArgumentNullException("info");
  34.            
  35.             string assemblyName = reflectedClass.Module.Assembly.FullName;
  36.             string typeName = reflectedClass.FullName;
  37.            
  38.             info.SetType(typeof(MemberInfoSerializationHolder));
  39.             info.AddValue("Name", name, typeof(string));
  40.             info.AddValue("AssemblyName", assemblyName, typeof(string));
  41.             info.AddValue("ClassName", typeName, typeof(string));
  42.             info.AddValue("Signature", signature, typeof(string));
  43.             info.AddValue("MemberType", (int)type);
  44.             info.AddValue("GenericArguments", genericArguments, typeof(Type[]));
  45.         }
  46.         #endregion
  47.        
  48.         #region Private Data Members
  49.         private string m_memberName;
  50.         private RuntimeType m_reflectedType;
  51.         private string m_signature;
  52.         private MemberTypes m_memberType;
  53.         private SerializationInfo m_info;
  54.         #endregion
  55.        
  56.         #region Constructor
  57.         internal MemberInfoSerializationHolder(SerializationInfo info, StreamingContext context)
  58.         {
  59.             if (info == null)
  60.                 throw new ArgumentNullException("info");
  61.            
  62.             string assemblyName = info.GetString("AssemblyName");
  63.             string typeName = info.GetString("ClassName");
  64.            
  65.             if (assemblyName == null || typeName == null)
  66.                 throw new SerializationException(Environment.GetResourceString("Serialization_InsufficientState"));
  67.            
  68.             Assembly assem = FormatterServices.LoadAssemblyFromString(assemblyName);
  69.             m_reflectedType = assem.GetType(typeName, true, false) as RuntimeType;
  70.             m_memberName = info.GetString("Name");
  71.             m_signature = info.GetString("Signature");
  72.             m_memberType = (MemberTypes)info.GetInt32("MemberType");
  73.             m_info = info;
  74.         }
  75.         #endregion
  76.        
  77.         #region ISerializable
  78.         public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
  79.         {
  80.             throw new NotSupportedException(Environment.GetResourceString(ResId.NotSupported_Method));
  81.         }
  82.         #endregion
  83.        
  84.         #region IObjectReference
  85.         public virtual object GetRealObject(StreamingContext context)
  86.         {
  87.             if (m_memberName == null || m_reflectedType == null || m_memberType == 0)
  88.                 throw new SerializationException(Environment.GetResourceString(ResId.Serialization_InsufficientState));
  89.            
  90.             BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.OptionalParamBinding;
  91.            
  92.             switch (m_memberType) {
  93.                 case MemberTypes.Field:
  94.                     #region case MemberTypes.Field:
  95.                    
  96.                     {
  97.                         FieldInfo[] fields = m_reflectedType.GetMember(m_memberName, MemberTypes.Field, bindingFlags) as FieldInfo[];
  98.                        
  99.                         if (fields.Length == 0)
  100.                             throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_UnknownMember"), m_memberName));
  101.                        
  102.                         return fields[0];
  103.                     }
  104.                     break;
  105.                 case MemberTypes.Event:
  106.                     #endregion
  107.                    
  108.                     #region case MemberTypes.Event:
  109.                    
  110.                     {
  111.                         EventInfo[] events = m_reflectedType.GetMember(m_memberName, MemberTypes.Event, bindingFlags) as EventInfo[];
  112.                        
  113.                         if (events.Length == 0)
  114.                             throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_UnknownMember"), m_memberName));
  115.                        
  116.                         return events[0];
  117.                     }
  118.                     break;
  119.                 case MemberTypes.Property:
  120.                     #endregion
  121.                    
  122.                     #region case MemberTypes.Property:
  123.                    
  124.                     {
  125.                         PropertyInfo[] properties = m_reflectedType.GetMember(m_memberName, MemberTypes.Property, bindingFlags) as PropertyInfo[];
  126.                        
  127.                         if (properties.Length == 0)
  128.                             throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_UnknownMember"), m_memberName));
  129.                        
  130.                         if (properties.Length == 1)
  131.                             return properties[0];
  132.                        
  133.                         if (properties.Length > 1) {
  134.                             for (int i = 0; i < properties.Length; i++) {
  135.                                 if ((properties[i]).ToString().Equals(m_signature))
  136.                                     return properties[i];
  137.                             }
  138.                         }
  139.                        
  140.                         throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString(ResId.Serialization_UnknownMember), m_memberName));
  141.                     }
  142.                     break;
  143.                 case MemberTypes.Constructor:
  144.                     #endregion
  145.                    
  146.                     #region case MemberTypes.Constructor:
  147.                    
  148.                     {
  149.                         if (m_signature == null)
  150.                             throw new SerializationException(Environment.GetResourceString(ResId.Serialization_NullSignature));
  151.                        
  152.                         ConstructorInfo[] constructors = m_reflectedType.GetMember(m_memberName, MemberTypes.Constructor, bindingFlags) as ConstructorInfo[];
  153.                        
  154.                         if (constructors.Length == 1)
  155.                             return constructors[0];
  156.                        
  157.                         if (constructors.Length > 1) {
  158.                             for (int i = 0; i < constructors.Length; i++) {
  159.                                 if (constructors[i].ToString().Equals(m_signature))
  160.                                     return constructors[i];
  161.                             }
  162.                         }
  163.                        
  164.                         throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString(ResId.Serialization_UnknownMember), m_memberName));
  165.                     }
  166.                     break;
  167.                 case MemberTypes.Method:
  168.                     #endregion
  169.                    
  170.                     #region case MemberTypes.Method:
  171.                    
  172.                     {
  173.                         MethodInfo methodInfo = null;
  174.                        
  175.                         if (m_signature == null)
  176.                             throw new SerializationException(Environment.GetResourceString(ResId.Serialization_NullSignature));
  177.                        
  178.                         Type[] genericArguments = m_info.GetValueNoThrow("GenericArguments", typeof(Type[])) as Type[];
  179.                        
  180.                         MethodInfo[] methods = m_reflectedType.GetMember(m_memberName, MemberTypes.Method, bindingFlags) as MethodInfo[];
  181.                        
  182.                         if (methods.Length == 1)
  183.                             methodInfo = methods[0];
  184.                        
  185.                         else if (methods.Length > 1) {
  186.                             for (int i = 0; i < methods.Length; i++) {
  187.                                 if (methods[i].ToString().Equals(m_signature)) {
  188.                                     methodInfo = methods[i];
  189.                                     break;
  190.                                 }
  191.                                
  192.                                 if (genericArguments != null && methods[i].IsGenericMethod) {
  193.                                     if (methods[i].GetGenericArguments().Length == genericArguments.Length) {
  194.                                         MethodInfo candidateMethod = methods[i].MakeGenericMethod(genericArguments);
  195.                                         if (candidateMethod.ToString().Equals(m_signature)) {
  196.                                             methodInfo = candidateMethod;
  197.                                             break;
  198.                                         }
  199.                                     }
  200.                                 }
  201.                             }
  202.                         }
  203.                        
  204.                         if (methodInfo == null)
  205.                             throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString(ResId.Serialization_UnknownMember), m_memberName));
  206.                        
  207.                         if (!methodInfo.IsGenericMethodDefinition)
  208.                             return methodInfo;
  209.                        
  210.                         if (genericArguments == null)
  211.                             return methodInfo;
  212.                        
  213.                         if (genericArguments[0] == null)
  214.                             return null;
  215.                        
  216.                         return methodInfo.MakeGenericMethod(genericArguments);
  217.                     }
  218.                     break;
  219.                 default:
  220.                     #endregion
  221.                    
  222.                     throw new ArgumentException(Environment.GetResourceString("Serialization_MemberTypeNotRecognized"));
  223.                     break;
  224.             }
  225.         }
  226.         #endregion
  227.     }
  228.    
  229.    
  230. }

Developer Fusion