一.反射介紹
反射是.NET中的重要機制,通過反射,可以在運行時獲得程式或程式集中每一個型別(包括類、結構、委托、介面和列舉等)的成員和成員的資訊,
有了反射,即可對每一個型別了如指掌,另外我還可以直接創建物件,即使這個物件的型別在編譯時還不知道,
二.反射的用途
1.使用Assembly定義和加載程式集,加載在程式集清單中列出模塊,以及從此程式集中查找型別并創建該型別的實體
2.使用Module了解包含模塊的程式集以及模塊中的類等,還可以獲取在模塊上定義的所有全域方法或其他特定的非全域方法
3.使用ConstructorInfo了解建構式的名稱、引數、訪問修飾符(如pulic 或private)和實作詳細資訊(如abstract或virtual)等
4.使用MethodInfo了解方法的名稱、回傳型別、引數、訪問修飾符(如pulic 或private)和實作詳細資訊(如abstract或virtual)等
5.使用FiedInfo了解欄位的名稱、訪問修飾符(如public或private)和實作詳細資訊(如static)等,并獲取或設定欄位值
6.使用EventInfo了解事件的名稱、事件處理程式資料型別、自定義屬性、宣告型別和反射型別等,添加或移除事件處理程式
7.使用PropertyInfo了解屬性的名稱、資料型別、宣告型別、反射型別和只讀或可寫狀態等,獲取或設定屬性值
8.使用ParameterInfo了解引數的名稱、資料型別、是輸入引數還是輸出引數,以及引數在方法簽名中的位置等
三.反射中主要用到的類介紹
1.System.Reflection.Assembly類
用于訪問給定程式集的資訊,或者把這個程式集加載到程式中

部分方法介紹:

2.System.Type類
System.Type 類對于反射起著核心的作用,但它是一個抽象的基類,Type有與每種資料型別對應的派生類,
我們使用這個派生類的物件的方法、欄位、屬性來查找有關該型別的所有資訊

Type類的部分屬性:
Name 資料型別名
FullName 資料型別的完全限定名(包括命名空間名)
Namespace 定義資料型別的命名空間名
IsAbstract 指示該型別是否是抽象型別
IsArray 指示該型別是否是陣列
IsClass 指示該型別是否是類
IsEnum 指示該型別是否是列舉
IsInterface 指示該型別是否是介面
IsPublic 指示該型別是否是公有的
IsSealed 指示該型別是否是密封類
IsValueType 指示該型別是否是值型別
Type類的部分方法介紹:
GetConstructor(), GetConstructors():回傳ConstructorInfo型別,用于取得該類的建構式的資訊
GetEvent(), GetEvents():回傳EventInfo型別,用于取得該類的事件的資訊
GetField(), GetFields():回傳FieldInfo型別,用于取得該類的欄位(成員變數)的資訊
GetInterface(), GetInterfaces():回傳InterfaceInfo型別,用于取得該類實作的介面的資訊
GetMember(), GetMembers():回傳MemberInfo型別,用于取得該類的所有成員的資訊
GetMethod(), GetMethods():回傳MethodInfo型別,用于取得該類的方法的資訊
GetProperty(), GetProperties():回傳PropertyInfo型別,用于取得該類的屬性的資訊
可以呼叫這些成員,其方式是呼叫Type的InvokeMember()方法,或者呼叫MethodInfo,
PropertyInfo和其他類的Invoke()方法,
學習可以參考:
https://docs.microsoft.com/zh-cn/dotnet/api/system.reflection.assembly?view=netcore-3.1
https://docs.microsoft.com/zh-cn/dotnet/api/system.type?view=netcore-3.1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/82995.html
標籤:C#
