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版)
參考資料:





