clrtype.cs

来自「没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没」· CS 代码 · 共 1,094 行 · 第 1/2 页

CS
1,094
字号
/* * ClrType.cs - Implementation of the "System.Reflection.ClrType" class. * * Copyright (C) 2001  Southern Storm Software, Pty Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */namespace System.Reflection{using System;using System.Collections;using System.Globalization;using System.Runtime.CompilerServices;using System.Runtime.Serialization;internal class ClrType : Type, ICloneable, IClrProgramItem#if CONFIG_SERIALIZATION	, ISerializable#endif{	// Internal state.	internal IntPtr privateData;#if CONFIG_REFLECTION	private static IComparer memberNameComparer =			new MemberNameComparer();	// Comparer class for member names.	private sealed class MemberNameComparer : IComparer	{		public int Compare(Object x, Object y)				{					return String.CompareOrdinal						(((MemberInfo)x).Name, ((MemberInfo)y).Name);				}	}; // class MemberNameComparer#endif	// Constructor.  This class is normally instantiated	// by the runtime engine, not by the class library.	internal ClrType() : base() { privateData = IntPtr.Zero; }	// Implement the ICloneable interface.	public Object Clone()			{				return this;			}	// Implement the IClrProgramItem interface.	public IntPtr ClrHandle			{				get				{					return privateData;				}			}	// Get the rank of this type, if it is an array.	public override int GetArrayRank()			{				if(IsArray)				{					return GetClrArrayRank();				}				else				{					throw new NotSupportedException(_("NotSupp_NotArrayType"));				}			}	[MethodImpl(MethodImplOptions.InternalCall)]	extern private int GetClrArrayRank();	// Get the attribute flags for this type.#if CONFIG_REFLECTION	[MethodImpl(MethodImplOptions.InternalCall)]	extern protected override TypeAttributes GetAttributeFlagsImpl();#else	[MethodImpl(MethodImplOptions.InternalCall)]	extern internal override TypeAttributes GetAttributeFlagsImpl();#endif	// Get the category of this type.  Array, pointer, byref, primitive, etc.	[MethodImpl(MethodImplOptions.InternalCall)]	extern private ClrTypeCategory GetClrTypeCategory();	// Get the element type for this type.#if CONFIG_REFLECTION	[MethodImpl(MethodImplOptions.InternalCall)]	extern public override Type GetElementType();#else	[MethodImpl(MethodImplOptions.InternalCall)]	extern internal override Type GetElementType();#endif	// Get all interfaces that this type implements.#if CONFIG_REFLECTION	[MethodImpl(MethodImplOptions.InternalCall)]	extern public override Type[] GetInterfaces();#else	[MethodImpl(MethodImplOptions.InternalCall)]	extern internal override Type[] GetInterfaces();#endif	// Implementation of the "IsArray" property.	protected override bool IsArrayImpl()			{				return (GetClrTypeCategory() == ClrTypeCategory.Array);			}	// Implementation of the "IsPointer" property.	protected override bool IsPointerImpl()			{				return (GetClrTypeCategory() == ClrTypeCategory.Pointer);			}	// Implementation of the "IsPrimitive" property.#if CONFIG_REFLECTION	protected override bool IsPrimitiveImpl()#else	internal override bool IsPrimitiveImpl()#endif			{				return (GetClrTypeCategory() == ClrTypeCategory.Primitive);			}	// Determine if the current type is a subclass of another type.	[MethodImpl(MethodImplOptions.InternalCall)]	extern public override bool IsSubclassOf(Type c);	// Convert this type into a string.	public override String ToString()			{				return GetClrFullName();			}#if CONFIG_RUNTIME_INFRA	// Internal methods for supporting the properties.	[MethodImpl(MethodImplOptions.InternalCall)]	extern private System.Reflection.Assembly GetClrAssembly();#endif	[MethodImpl(MethodImplOptions.InternalCall)]	extern private Type GetClrBaseType();	[MethodImpl(MethodImplOptions.InternalCall)]	extern private String GetClrFullName();	// Properties that are accessible even if no reflection.	public override String AssemblyQualifiedName			{				get				{#if CONFIG_RUNTIME_INFRA					return FullName + ", " + Assembly.ToString();#else					return FullName;#endif				}			}	public override Type BaseType			{				get				{					return GetClrBaseType();				}			}	public override String FullName			{				get				{					return GetClrFullName();				}			}#if CONFIG_RUNTIME_INFRA	// Runtime infrastructure properties.	public override RuntimeTypeHandle TypeHandle			{				get				{					return new RuntimeTypeHandle(privateData);				}			}	public override System.Reflection.Assembly Assembly			{				get				{					return GetClrAssembly();				}			}#endif // CONFIG_RUNTIME_INFRA#if CONFIG_REFLECTION	// Get the custom attributes for this type.	public override Object[] GetCustomAttributes(bool inherit)			{				return ClrHelpers.GetCustomAttributes(this, inherit);			}	public override Object[] GetCustomAttributes(Type type, bool inherit)			{				return ClrHelpers.GetCustomAttributes(this, type, inherit);			}	// Determine if custom attributes are defined for this type.	public override bool IsDefined(Type type, bool inherit)			{				return ClrHelpers.IsDefined(this, type, inherit);			}	// Get the hash code for this type.	public override int GetHashCode()			{				// We convert via long to prevent IntPtr throwing				// an overflow exception on 64-bit platforms.				return unchecked((int)(privateData.ToInt64()));			}	// Get an interface that this type implements.	[MethodImpl(MethodImplOptions.InternalCall)]	extern public override Type GetInterface(String name, bool ignoreCase);	// Get a member from this type.  The member could be a field,	// method, constructor, event, property, or nested type.	[MethodImpl(MethodImplOptions.InternalCall)]	extern private MemberInfo GetMemberImpl				(String name, MemberTypes memberTypes,			     BindingFlags bindingAttr, Binder binder,				 CallingConventions callingConventions,				 Type[] types, ParameterModifier[] modifiers);	// Get a list of members from this type.  Returns an array,	// which must then be cast to the correct type.	[MethodImpl(MethodImplOptions.InternalCall)]	extern private Object GetMembersImpl(MemberTypes memberTypes,										 BindingFlags bindingAttr,										 Type arrayType,										 String name);			[Flags]	private enum MemberComparison	{		None = 0x01,		Candidate = 0x02,		Override = 0x04,	}		/* 	 * Check if m1 overrides m2	 */	private MemberComparison CompareMembers(MemberInfo m1, MemberInfo m2)			{				if(m1.MemberType != m2.MemberType || m1.Name!=m2.Name)				{						return MemberComparison.None;				}				if(m1.MemberType==MemberTypes.Field)				{					if(((FieldInfo)m1).Attributes==((FieldInfo)m2).Attributes)					{						goto overrideCheck;					}				}				MethodBase method1 = null;				MethodBase method2 = null;				switch(m1.MemberType)				{					case MemberTypes.Constructor:					{						method1=(MethodBase)m1;						method2=(MethodBase)m2;					}					break;					case MemberTypes.Method:					{						method1=(MethodBase)m1;						method2=(MethodBase)m2;					}					break;										case MemberTypes.Property:					{						if(((PropertyInfo)m1).GetAccessors().Length==0 &&						   ((PropertyInfo)m2).GetAccessors().Length==0)						{							if(((PropertyInfo)m1).Attributes == 									((PropertyInfo)m2).Attributes)							{								goto overrideCheck;							}						}						method1=((PropertyInfo)m1).GetGetMethod() != null ?									((PropertyInfo)m1).GetGetMethod() :									((PropertyInfo)m1).GetSetMethod() ;												method2=((PropertyInfo)m2).GetGetMethod() != null ?									((PropertyInfo)m2).GetGetMethod() :									((PropertyInfo)m2).GetSetMethod() ;					}					break;										case MemberTypes.Event:					{						method1=((EventInfo)m1).GetAddMethod() != null ?									((EventInfo)m1).GetAddMethod() :									((EventInfo)m1).GetRemoveMethod() ;												method2=((EventInfo)m2).GetAddMethod() != null ?									((EventInfo)m2).GetAddMethod() :									((EventInfo)m2).GetRemoveMethod() ;					}					break;				}				if((method1.Attributes | MethodAttributes.NewSlot) 							!= (method1.Attributes | MethodAttributes.NewSlot))				{					return MemberComparison.None;				}				ParameterInfo [] pinfo1 = method1.GetParameters();				ParameterInfo [] pinfo2 = method2.GetParameters();				if(pinfo1.Length != pinfo2.Length)				{					return MemberComparison.None;				}				for(int i=0;i<pinfo1.Length;i++)				{					if(pinfo1[i].Attributes!=pinfo2[i].Attributes ||						pinfo1[i].ParameterType != pinfo2[i].ParameterType)					{						return MemberComparison.None;					}				}				if(method1 is MethodInfo)				{					if(((MethodInfo)method2).ReturnType.Equals(								((MethodInfo)method1).ReturnType))					{						return MemberComparison.None;					}				}			overrideCheck:				if(m1.DeclaringType.IsSubclassOf(m2.DeclaringType))				{					return MemberComparison.Candidate 							| MemberComparison.Override;				}				return MemberComparison.Candidate;			}	/// <summary>	/// This function sorts and removes overrides from an array of	/// MemberInfo[]	/// </summary>	private Object TrimMembers(Object memberArray, Type type)			{				MemberInfo[] members=(MemberInfo[])(memberArray);				ArrayList list=new ArrayList(members.Length/2);				int best;				// Sort the members on name to make it easier to				// efficiently remove overrides.				Array.Sort(members, memberNameComparer);				// Remove overrides from the list.				int i = 0;				while(i < members.Length)				{					best = i;					++i;					while(i < members.Length &&					      members[i].Name == members[best].Name)					{						MemberComparison cmp = CompareMembers(members[i], 															  members[best]);						if(cmp == MemberComparison.None)						{							break;						}						if((cmp & MemberComparison.Candidate) != 0)						{							if((cmp & MemberComparison.Override) != 0)							{								best = i;							}						}						++i;					}					list.Add(members[best]);				}				return list.ToArray(type);			}		// Implementation of "GetConstructor" provided by subclasses.	protected override ConstructorInfo					GetConstructorImpl(BindingFlags bindingAttr,								       Binder binder,								       CallingConventions callingConventions,								       Type[] types,								       ParameterModifier[] modifiers)			{				if(bindingAttr == 0)				{					bindingAttr = BindingFlags.Public |								  BindingFlags.Instance;				}				return (ConstructorInfo)GetMemberImpl							(".ctor", MemberTypes.Constructor,							 bindingAttr | BindingFlags.DeclaredOnly,							 binder, callingConventions,							 types, modifiers);			}	// Get all constructors for this type.	public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr)			{				if(bindingAttr == 0)				{					bindingAttr = BindingFlags.Public |								  BindingFlags.Instance;				}				return (ConstructorInfo[])TrimMembers(GetMembersImpl							(MemberTypes.Constructor,							 bindingAttr | BindingFlags.DeclaredOnly,							 typeof(ConstructorInfo[]), null),							 typeof(ConstructorInfo));			}	// Get an event from this type.	public override EventInfo GetEvent(String name, BindingFlags bindingAttr)			{				return (EventInfo)GetMemberImpl							(name, MemberTypes.Event,							 bindingAttr, null, CallingConventions.Any,							 null, null);			}	// Get all events from this type.	public override EventInfo[] GetEvents(BindingFlags bindingAttr)			{				return (EventInfo[])TrimMembers(GetMembersImpl							(MemberTypes.Event, bindingAttr,							 typeof(EventInfo[]), null),							 typeof(EventInfo));			}	// Get a field from this type.	public override FieldInfo GetField(String name, BindingFlags bindingAttr)			{				return (FieldInfo)GetMemberImpl							(name, MemberTypes.Field,							 bindingAttr, null, CallingConventions.Any,							 null, null);			}	// Get all fields from this type.	public override FieldInfo[] GetFields(BindingFlags bindingAttr)			{				return (FieldInfo[]) TrimMembers(GetMembersImpl										(MemberTypes.Field, bindingAttr,										 typeof(FieldInfo[]), null), 										 typeof(FieldInfo));			}	// Get a member from this type.#if ECMA_COMPAT	internal#else	public#endif	override MemberInfo[] GetMember				(String name, MemberTypes type, BindingFlags bindingAttr)			{				if(name == null)				{					throw new ArgumentNullException("name");				}				return (MemberInfo[]) TrimMembers(GetMembersImpl										(type, bindingAttr, 										typeof(MemberInfo[]), name),										typeof(MemberInfo));			}	// Get all members from this type.	public override MemberInfo[] GetMembers(BindingFlags bindingAttr)			{				return (MemberInfo[]) TrimMembers(GetMembersImpl										(MemberTypes.All, 										bindingAttr, 										typeof(MemberInfo[]), null),										typeof(MemberInfo));			}	// Implementation of "GetMethod" provided by subclasses.	protected override MethodInfo					GetMethodImpl(String name,								  BindingFlags bindingAttr, Binder binder,								  CallingConventions callingConventions,								  Type[] types,								  ParameterModifier[] modifiers)			{				return (MethodInfo)GetMemberImpl							(name, MemberTypes.Method,							 bindingAttr, binder, callingConventions,							 types, modifiers);			}	// Get all methods from this type.	public override MethodInfo[] GetMethods(BindingFlags bindingAttr)			{				return (MethodInfo[]) TrimMembers(GetMembersImpl									(MemberTypes.Method, bindingAttr,									 typeof(MethodInfo[]), null), 									 typeof(MethodInfo));			}	// Get a nested type from this type.	public override Type GetNestedType(String name, BindingFlags bindingAttr)			{				return (Type)GetMemberImpl							(name, MemberTypes.NestedType,							 bindingAttr, null, CallingConventions.Any,							 null, null);			}	// Get all nested types from this type.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?