=============C#.Net 篇目录==============
Type 类
表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型。这个类是线程安全的。
Type 为 System.Reflection 功能的根,也是访问元数据的主要方式。使用 Type 的成员获取关于类型声明的信息,如构造函数、方法、字段、属性和类的事件,以及在其中部署该类的模块和程序集。
Type 是允许多个实现的抽象基类。在反射时,并不直接使用Type类,使用的是公共语言运行时 (CLR) 提供的类型。例如,使用 C# 的 typeof 运算符获取 Type 对象时,该对象实际上是 RuntimeType。 RuntimeType 派生自 Type,并提供所有抽象方法的实现。这些运行时类是 internal。它们的行为由基类文档描述的。
抽象类Type
只读静态字段(static readonly):
Delimiter,EmptyTypes,FilterAttribute,FilterName,FilterNameIgnoreCase,Missing
属性:
Assembly,AssemblyQualifiedName,Attributes,BaseType,ContainsGenericParameters,DeclaringMethod,DeclaringType,FullName,GenericParameterAttributes,GenericParameterPosition,GuId,HasElementType,IsAbstract,IsAnsiClass,IsArray,IsAutoClass,IsAutoLayout,IsByRef,IsClass,IsCOMObject,IsContextful,IsEnum,IsExplicitLayout,IsGenericParameter,IsGenericType,IsGenericTypeDefinition,IsImport,IsInterface,IsLayoutSequential,IsMarshalByBef,IsNested,IsNestedAssembly,IsNestedFamANDAssem,IsNestedFamily,IsNestedFamORAssem,IsNestedPrivate,IsNestedPublic,IsNotPublic,IsPointer,IsPrimitive,IsPublic,IsSealed,IsSecurityCritical,IsSecuritySafeCritical,IsSecurityTransparent,IsSerializable,IsSpecialName,IsUnicodeClass,IsValueType,IsVisible,MemberType,Module,Namespace,ReflectedType,StructLayoutAttribute,TypeHandle,TypeInitializer,UnderlyingSystemType
方法:
Equals(),FindInterfaces(),FindMembers(),GetArrayRank(),GetConstructor(),GetConstrusctors(),GetDefaultMembers(),GetElementType(),GetEnumName(),GetEnumNames(),GetEnumUnderlyingType(),GetEnumValues(),GetEvent(),GetEvents(),GetFIeld(),GetFIelds(),GetGenericArguments(),GetGenericParameterConstraints(),GetGenericTypeDefinition(),GetHashCode(),GetInterface(),GetInterfaceMap(),GetInterfaces(),GetMember(),GetMembers(),GetMethod(),GetMethods(),GetNestedType(),GetNestedTypes(),GetProperty(),GetProperties(),GetType(),InvokeMember(),IsAssignableFrom(),IsEnumDefined(),IsEquivalentTo(),IsInstanceOfType(),IsSubclassOf(),MakeArrayType(),MakeByRefType(),MakeGenericType(),MakePoinerType()
静态属性(static)
DefaultBinder
静态方法(statuc)
GetType(),GetTypeArray(),GetTypeCode(),GetTypeFromCLSID(),GetTypeFromHandle(),GetTypeFromProgID(),GetTypeHandle(),ReflectionOnlyGetType()
1. 从当前Type中按指定条件查找MemberInfo[]的两步:
1) 获取MemberFilter 委托
3个返回MemberFilter委托的Type静态只读属性
a) FilterAttribute 表示用在特性上的成员筛选器。
b) FilterName 表示用于名称的区分大小写的成员筛选器。
c) FilterNameIgnoreCase 表示用于名称的不区分大小写的成员筛选器。
MemberFilter 委托,用于Type的实例方法FindMembers,此委托封装的方法使用两个参数:第一个是 MemberInfo 对象,第二个是 Object。此方法确定 MemberInfo 对象是否与 Object 指定的判据相匹配。
2) 使用Type的实例方法FindMembers获取MemberInfo[]
参数:
MemberTypes [Flags]枚举,要筛选的成员类型;
BindingFlags 由一个或多个指定搜索执行方式的 System.Reflection.BindingFlags 组成。
MemberFilter 执行比较的委托,可以使用Type的3个静态只读属性获取,或则自行new对象,如果当前被检查的成员匹配 filterCriteria(最后一个参数),则返回 true;否则返回 false。
filterCriteria 确定成员是否在 MemberInfo 对象数组中返回的搜索判据。
a) 对于FilterAttribute返回的委托,此参数传枚举:FieldAttributes、MethodAttributes 或 MethodImplAttributes。
b) 对于FilterName和FilterNameIgnoreCase返回的委托,此参数传String,此字符串值可能包含一个【尾部】通配符字符“*”。(仅支持通配符结尾字符串匹配)
2. Missing与C#4.0的缺省参数
参考:http://www.cnblogs.com/artech/archive/2011/01/12/optionalparameter.html
C#4.0加入了缺省参数。(以前要实现默认值只能用重载方法)
1) 缺省参数编译后会转化为标注两个特性(OptionalAttribute--指示参数是可选的)和DefaultParameterValueAttribute )的参数形式,
2) 缺省参数的声明放在普通参数之后,数组参数(params)之前。因为参数类型的匹配优先级就为:General Parameter > optional parameter > params parameter。
3) 指定的缺省值必须是一个常量.
示例:
编译后(Reflector):
在反射上调用Type的实例方法InvokeMember() 时,不能使用命名实参来改变函数声明时的形参顺序,所以需要使用Type.Missing标识缺省值作为参数。
3. Assembly,AssemblyQualifiedName,FullName
1) Assembly
描述包含当前类型的程序集的 Assembly 实例。
对于泛型类型,该实例描述包含【泛型类型定义】的程序集,而不是创建和使用特定构造类型的程序集。
Assembly.FullName 获取程序集的显示名称。
EG:mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
2) AssemblyQualifiedName(程序集限定的类型名称)
获取 Type 的程序集限定名,其中包括从中加载 Type 的程序集的名称。
如果当前 Type 对象表示泛型参数,则此属性返回 Nothing。
EG:System.Array, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5
等效于( Type.FullName + “,” + Assembly.FullName )
3) FullName (类型名称)
Type 的完全限定名,包括 Type 的命名空间,但不包括程序集;
如果当前实例表示泛型类型参数、数组类型、指针类型或基于类型参数的 ref 类型,或表示不属于泛型类型定义但包含无法解析的类型参数的泛型类型,则返回 Nothing。
另外,在使用 GetType() 搜索并加载 Type时:
a) 结合类型名(Type.FullName)时,GetType 将只在调用方的程序集中查找 Type,然后再在系统程序集中查找。
b) 结合程序集限定类型名(Type.AssemblyQualifiedName)时,GetType 将在所有程序集中查找 Type。
4. IsGenericType,IsGenericTypeDefinition,ContainsGenericParameters
public class G<T> {}
public class Base<T, U> {}
public class Derived<V> : Base<string, V>
{
public G<Derived <V>> F;
public class Nested {}
}
1) 使用 IsGenericType 属性来确定 Type 对象是否表示泛型类型。使用 ContainsGenericParameters 属性来确定某个 Type 对象是表示开放构造的类型(不能实例化)还是封闭构造的类型(可以实例化)----是否包含未明确的类型参数。
例如: Derived<int>[] d = new Derived<int>[0]; 对于 d.GetType() 的类型:
i. IsGenericType 为 false,因为 d 是一个数组。
ii. IsGenericTypeDefinition 为 false。
iii. ContainsGenericParameters 为 false。
2) 当Type和最原始的【泛型声明】一致时IsGenericTypeDefinition才返回true,使用 IsGenericTypeDefinition 属性来确定是否能够从当前类型创建新的【类型】。
例如,Base<String,V> 其 IsGenericTypeDefinition 为 false。
3) 对于泛型的嵌套类
例如,对于typeof(Derived<>.Nested)
a) 在嵌套类型的类型参数列表中包括了封闭类型的类型参数。
EG:public class Outermost<T>
{
public class Inner<U>
{
public class Innermost1<V> {}
public class Innermost2 {}
}
}
如果封闭类型的参数列表有多个类型参数,则所有类型参数都按顺序包括在嵌套类型的类型参数列表中。
i. 嵌套类 Inner 的类型参数列表有两个类型参数 T 和 U,其中第一个是其封闭类的类型参数。
ii. 嵌套类 Innermost1 的类型参数列表有三个类型参数 T、U 和 V,其中 T 和 U 来自其封闭类。
iii. 嵌套类 Innermost2 有两个类型参数 T 和 U,它们都来自其封闭类。
为了从嵌套的类型的泛型类型定义来构造泛型类型,可以使用通过串联所有封闭类型的类型实参数组(从最外层的泛型类型开始,到嵌套的类型本身的类型实参数组结束)形成的数组来调用 MakeGenericType 方法。
b) IsGenericType 为 true,虽然 Nested 类没有它自己的泛型类型参数,因为它嵌套在一个泛型类型中。这说明了 IsGenericType 属性的递归性质。
c) IsGenericTypeDefinition 为 true。也就是说,您可以调用 MakeGenericType 方法,并提供封闭类型 Derived 的类型参数。
d) ContainsGenericParameters 为 true,因为封闭类型 Derived 具有泛型类型参数。这一点说明了 ContainsGenericParameters 属性的递归本质。
5. GetGenericTypeDefinition()、MakeGenericType()
如果具有的开放式泛型类型或方法不是泛型类型定义或泛型方法定义,则不能创建它的实例,也不能提供缺少的类型参数。必须具有泛型类型定义或泛型方法定义。
使用 GetGenericTypeDefinition 方法可获取泛型类型定义,再使用 MakeGenericType 方法创建封闭式泛型类型。
另:使用 MethodInfo.GetGenericMethodDefinition 方法可获取泛型方法定义,再使用 MakeGenericMethod 方法为封闭式泛型方法创建 MethodInfo。
--------------------------------------------------------------------------------
构造泛型类型的实例
1) 获取表示泛型类型的 Type 对象。下面的代码以两种不同方式获取泛型类型 Dictionary<TKey, TValue>:
a) 一种方法使用Type d1 = typeof(Dictionary<,>);
b) 另一种方法调用构造类型 Dictionary<String, Example>的 GetGenericTypeDefinition 方法。
Dictionary<string, Example> d2 = new Dictionary<string, Example>();
Type d3 = d2.GetType();
Type d4 = d3.GetGenericTypeDefinition();
2) 构造一组用于替换类型参数的类型变量。数组必须包含正确数目的 Type 对象,并且顺序和对象在类型参数列表中的顺序相同。
Type[] typeArgs = {typeof(string), typeof(Example)};
3) 调用 MakeGenericType 方法将类型变量绑定到类型参数,然后构造类型。
Type constructed = d1.MakeGenericType(typeArgs);
4) 使用 CreateInstance(Type) 方法重载来创建构造类型的对象。
object o = Activator.CreateInstance(constructed);
6. DeclaringMethod,DeclaringType,GenericParameterPosition,GenericParameterAttributes
1) DeclaringMethod
如果当前 Type 表示泛型方法的一个【类型参数】,则返回一个表示声明方法的 MethodBase;否则返回 Nothing。
2) DeclaringType
如果当前的类型是嵌套类型,则返回表示封闭类型的 Type 对象;
如果当前的类型是泛型类型或泛型类型的类型参数,则返回泛型类型的定义;
如果当前的类型是泛型方法的类型参数,则返回用来声明泛型方法的类型;
否则返回为 Nothing。
3) GenericParameterPosition
当 Type 对象表示泛型类型或泛型方法的类型参数时,获取类型参数在【声明】它的泛型类型或方法的类型参数列表中的位置。位置编号从 0 开始。
如果当前 Type 不表示类型参数,调用 GenericParameterPosition 属性将导致异常。在检查开放构造类型的类型实参时,应使用 IsGenericParameter 属性来告知哪些是类型参数。
为了给 GenericParameterPosition 属性的值提供正确的上下文,有必要标识类型参数所属的泛型类型或方法。
例如,考虑以下代码中的泛型方法 GetSomething 的返回值:
public class B<T, U> { }
public class A<V>
{
public B<V, X> GetSomething<X>()
{
return new B<V, X>();
}
}
GetSomething 返回的类型取决于提供给类 A 和 GetSomething 自身的类型参数。您可以为 GetSomething 获取 MethodInfo,然后从中获取返回类型。当检查返回类型的类型参数时,GenericParameterPosition 对二者均返回 0。因为 V 是类 A 的类型参数列表中的第一个类型参数;因为 X 是 GetSomething 的类型参数列表中的第一个类型参数。
可以确定泛型类型参数的源,方法如下:
泛型类型参数可能来自要检查的类型、封闭式类型或泛型方法。
首先,使用 DeclaringMethod 属性确定类型参数是否来自泛型方法。如果该属性值不是空引用,则源是泛型方法。
如果源不是泛型方法,则使用 DeclaringType 属性确定泛型类型参数所属的泛型类型。
4) GenericParameterAttributes
此属性的值包含了描述当前泛型类型参数是否为【协变的标志】以及类型参数约束是否为引用类型、不可为 null 的值类型和具有默认构造函数。
7. GetGenericParameterConstraints()
返回表示当前泛型类型参数约束的 Type 对象的数组。泛型类型参数上的每个约束都表示为一个 Type 对象。
使用 IsClass 属性确定约束是否为基类约束;如果该属性返回 false,则该约束为接口约束。如果类型参数没有类约束和接口约束,则返回空数组。
8. IsGenericParameter ,GetGenericArguments()
1) IsGenericParameter
获取一个值,该值指示当前 Type 是否表示泛型类型或方法的定义中的类型参数。
2) GetGenericArguments()
返回表示泛型类型的类型实参或泛型类型定义的类型形参的 Type 对象的数组。
数组元素按照它们出现在泛型类型的类型实参列表中的顺序返回。
a) 如果当前类型是封闭构造类型(即 ContainsGenericParameters 属性返回 false),则 GetGenericArguments 方法返回的数组将包含【已赋予】泛型类型定义的泛型类型形参的类型。IsGenericParameter 属性对 GetGenericArguments 方法返回的数组的每个元素返回 false。
b) 如果当前类型是泛型类型定义,该数组将包含类型形参。IsGenericParameter 属性对产生的数组的每个元素返回 true
c) 如果当前类型为开放构造类型(即 ContainsGenericParameters 属性返回 true),也就是说特定类型尚未分配给所有类型参数和封闭泛型类型或方法的类型参数,则数组【同时包含类型和类型参数】。使用 IsGenericParameter 属性来区分它们。
9. GetDefaultMembers()
默认成员由声明类型上的 DefaultMemberAttribute 特性表示。如果类声明了索引器,请勿手动添加 DefaultMemberAttribute;在该情况下,编译器会自动添加该特性。
下面的示例显示如何通过检索默认成员的自定义特性来检索默认成员。
Type classType = typeof(Class1);
Type attribType = typeof(DefaultMemberAttribute);
DefaultMemberAttribute defMem =
(DefaultMemberAttribute)Attribute.GetCustomAttribute((MemberInfo)classType, attribType);
MemberInfo[] memInfo = classType.GetMember(defMem.MemberName);
使用 Type.GetDefaultMembers 方法会生成相同的结果,但可能更简单一些。但是,如果在类型上定义了多个默认成员,则 GetDefaultMembers 会引发 InvalidOperationException。
还可以使用 Type实例的GetCustomAttributes 方法获得类型的自定义特性,并仅选择 DefaultMemberAttribute。
10. HasElementType,GetElementType()
HasElementType:获取一个值,通过该值指示当前 Type 是内含还是引用另一类型,即当前 Type 是数组、指针还是通过引用传递。如果 Type 为数组、指针或按引用传递,则为 true;否则为 false。
如果当前 Type 表示泛型类型,或泛型类型或泛型方法的定义中的类型参数,则此属性始终返回 false。
使用 GetElementType 来确定 Type 的元素类型。
示例:
泛型类型的数组本身不是泛型类型。您不能对诸如 C<T>[]的数组类型调用 MakeGenericType。若要基于 C<T>[] 构造封闭泛型类型,需要调用 GetElementType 以获取泛型类型定义 C<T>,对该泛型类型定义调用 MakeGenericType 以【创建构造类型】,最后对该构造类型调用 MakeArrayType 方法以【创建数组类型】。对于指针类型和 ref 类型也是如此。
11. bool IsAssignableFrom(Type c),bool IsInstanceOfType(object o),bool IsSubclassOf(Type c)
1) bool IsAssignableFrom(Type c)
确定当前的 Type 的实例是否可以从指定 Type 的实例分配。
如果满足下列任一条件,则为 true:即:父类.IsAssignableFrom(子类)
a) c 和当前 Type 表示同一类型;
b) 当前 Type 位于 c 的继承层次结构中;
c) 当前 Type 是 c 实现的接口;
d) c 是泛型类型参数且当前 Type 表示 c 的约束之一。
如果不满足上述任何一个条件或者 c 为 Nothing,则为 false。
如果 c 参数的类型为 System.Reflection.Emit.TypeBuilder,则结果基于要生成的类型。
2) bool IsInstanceOfType(object o)
确定指定的对象是否是当前 Type 的实例。
如果满足下列任一条件,则为 true:即:父类.IsInstanceOfType(子类对象)
a) 当前 Type 位于由 o 表示的对象的继承层次结构中;
b) 当前 Type 是 o 支持的接口。
如果不属于其中任一种情况,或者 o 为 Nothing,或者当前 Type 为开放式泛型类型(即 ContainsGenericParameters 返回 true),则为 false。
3) bool IsSubclassOf(Type c) 即:子类.IsSubClassOf(父类)
确定当前 Type 表示的类是否是从指定的 Type 表示的类派生的。
如果 Type 由 c 参数表示并且当前的 Type 表示类,并且当前的 Type 所表示的类是从 c 所表示的类派生的,则为 true;否则为 false。
如果 c 和当前的 Type 表示相同的类,则此方法还返回 false。
IsSubclassOf 方法不能用于确定某个接口是否派生自另一个接口或某个类是否实现了某个接口。对于此目的,应该使用 GetInterface 方法。
12. IsArray
获取一个值,通过该值指示 Type 是否为数组。Eg:int[] array = {1,2,3,4};
对于 Array 类,IsArray 属性返回 false。要检查数组,请使用诸如 typeof(Array).IsAssignableFrom(type) 之类的代码。
13. IsEnum,IsClass,IsValueType
1) IsEnum
获取一个值,该值指示当前的 Type 是否表示枚举。IsEnum属性对枚举返回 true,但是对 Enum 类型本身则不然(Enum 类型本身是class)。
2) IsValueType
获取一个值,通过该值指示 Type 是否为值类型。
IsValueType属性对 ValueType 类返回 false,因为 ValueType 自身不是值类型。它是所有值类型的基类,因此可以将任何值类型分配给它。在将值类型分配给类型为 ValueType 的字段时,会将值类型装箱。如果 ValueType 自身是值类型,则不能这样做。
IsValueType属性对枚举返回 true,但是对 Enum 类型本身则不然。
3) IsClass
获取一个值,通过该值指示 Type 是否是一个类;即,不是值类型或接口。注意:对于表示 Enum 和 ValueType 的 Type,此属性返回 true。
14. IsContextful、IsMarshalByRef、IsPrimitive
检查给定类型可否在当前上下文中承载,该类型可否按引用来进行封送,以及该类型是否是基元数据类型。
基元类型为 Boolean、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Char、Double 和 Single。
IsContextfil在Type中的默认实现如下:
ContextBoundObject
上下文可以看作应用程序域中一个包含对象和消息接收器的区域。对上下文里的对象的调用会转换成可以被MessageSink(消息接收器)拦截和处理的消息。我们知道要把调用转换成消息,必须通过透明代理这个中介。而且,仅当对象是MarshalByRefObject的子类的实例并被其所在的应用程序域以外的实体调用时,CLR才会为它创建透明代理。
ContextBoundObject的子类的实例被视为上下文绑定的(context-bound)。没有继承自ContextBoundObject的类的实例则被视为上下文灵活的(context-agile)。
a) 上下文绑定的对象永远在其上下文中执行。
b) 只要不是远程对象,上下文灵活的对象总是在执行这个调用的上下文中执行。
15. IsSecurityCritical,IsSecuritySafeCritical,IsSecurityTransparent
1) IsSecurityCritical [SecurityCriticalAttribute]
如果当前类型在当前信任级别上是安全关键的或安全可靠关键的,则为 true;如果它是透明的,则为 false。
2) IsSecuritySafeCritical [SecuritySafeCriticalAttribute]
如果当前类型在当前信任级别上是安全可靠关键的,则为 true;如果它是安全关键的或透明的,则为 false。
3) IsSecurityTransparent [SecurityTransparentAttribute]
如果该类型在当前信任级别上是安全透明的,则为 true;否则为 false。
安全级别 |
IsSecurityCritical |
IsSecuritySafeCritical |
IsSecurityTransparent |
Critical(关键的) |
true |
false |
false |
安全关键的 |
true |
true |
false |
透明 |
false |
false |
true |
对于部分信任的程序集,这些属性的值取决于该程序集的当前信任级别。
a) 如果程序集被加载到一个部分信任的应用程序域(例如,加载到沙盒中的应用程序域),则运行时将忽略程序集的安全注释。将程序集及其所有类型都当作透明。
b) 仅当该程序集被加载到一个完全受信任的应用程序域时(例如,加载到桌面应用程序的默认应用程序域中),运行库才会注意部分受信任的程序集的安全注释。
c) 受信任的程序集(即,安装在全局程序集缓存中的强名称程序集)始终以完全信任的方式加载,而不管应用程序域的信任级别,因此其当前信任级别始终是完全受信任。
使用 Assembly.IsFullyTrusted 和 AppDomain.IsFullyTrusted 属性,可确定程序集和应用程序域的当前信任级别。
16. IsVisible
获取一个指示 Type 是否可由程序集之外的代码访问的值。如果当前 Type 是公共类型或公共嵌套类型从而使所有封闭类型都是公共类型,则为 true;否则为 false.
IsVisible属性可以确定类型是否为组件程序集的公共接口的一部分。
17. TypeHandle
获取当前 Type 的句柄。
TypeHandle 封装指向表示类型的内部数据结构的指针。此句柄在进程的生存期内是唯一的。该句柄仅在从中获取它的应用程序域中有效。
18. 在某个类型上进行反射时,Get 系列方法返回的【基类】的成员。
成员类型 |
Static |
非静态 |
构造函数 |
否 |
否 |
嵌套类型 |
||
Event |
不适用 |
常规类型系统规则是:该继承与实现属性的方法的继承相同。反射将属性视为按名称和签名隐藏。 |
Property |
||
字段 |
否 |
是。字段总是按名称和签名隐藏。 |
方法 |
否 |
是。方法(虚方法和非虚方法)可按名称隐藏或按名称和签名隐藏。 |
a) 【按名称和签名隐藏】会考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、标记和非托管调用约定。这是二进制比较。
b) 【属性和事件按名称和签名隐藏】如果基类中有同时带 get 访问器和 set 访问器的属性,但派生类中仅有 get 访问器,则派生类属性隐藏基类属性,并且您将无法访问基类的设置程序。
c) 自定义特性不是常规类型系统的组成部分。
19. (静态)ReflectionOnlyGetType(string typeName, bool throwIfNotFound, bool ignoreCase)
获取具有指定名称的 Type,指定是否执行区分大小写的搜索,以及在找不到类型时是否引发异常。该类型只为反射加载,而不为执行加载。
a) 如果包含该类型的程序集尚未加载到仅反射上下文中,且该类型是程序集限定类型,则使用 ReflectionOnlyGetType 方法等效于首先使用 ReflectionOnlyLoad 方法仅为反射加载程序集,然后通过调用程序集的 Assembly.GetType 方法加载该类型。
b) 如果程序集已为执行而加载,则另一个副本加载到仅“反射上下文”中。
20. Type MakeByRefType(),Type MakePointerType()
MakeByRefType() 返回表示作为 ref 参数传递时的当前类型的 Type 对象。使用 Microsoft 中间语言 (MSIL) 的语法,如果当前 Type 对象表示 Int32,则此方法将返回表示 Int32& 的 Type 对象。
MakePointerType() 返回表示指向当前类型的指针的 Type 对象。使用 Microsoft 中间语言 (MSIL) 的语法,如果当前 Type 对象表示 Int32,则此方法将返回表示 Int32* 的 Type 对象。
EG:public void Test(ref Example e){ }
Type t = typeof(Example).MakeByRefType(); // ToString() 输出“Example&”
Type t = typeof(Example).MakePointerType(); // ToString() 输出” Example*”
21. GetInterfaceMap(Type interfaceType)
我们通过 FindInterfaces(),GetInterfaces(),GetInterface() 方法可以获取指定类型及其所有基类型上定义的所有接口。但是,我们不能得到接口与实现该接口的实际方法之间的映射。这时我们就需要调用 GetInterfaceMap() 返回映射关系类InterfaceMapping类。
InterfaceMapping 类型定义的4个公共字段
字段名称 |
数据类型 |
说明 |
TargetType |
Type |
这是用于调用GetInterfaceMapping的类型 |
InterfaceType |
Type |
传给GetInterfaceMapping的接口类型 |
InterfaceMethods |
MethodInfo[] |
一个数组,它的每个元素都暴露了与一个接口的方法有关的信息 |
TargetMethods |
MethodInfo[] |
一个数组,它的每个元素都暴露了由类型定义的一个方法的信息,这个方法实现了接口中对应的方法 |
InterfaceMethods 和 TargetMethods数组是互为对应的
《反射机制》系列:
推荐阅读:C# 使用 Binder 类自定义反射
参考书籍:CLR via C#(第3版)
参考资料: