來看看如何在 C# 中使用反射
導讀 | C# 中的 反射 常用於在程式的執行時獲取 型別 的後設資料,可獲取的資訊包括已載入到程式中的 程式集 和 型別 資訊,它和 C++ 中的 RTTI(Runtime Type Information) 的作用是差不多的。 |
C# 中的 反射 常用於在程式的執行時獲取 型別 的後設資料,可獲取的資訊包括已載入到程式中的 程式集 和 型別 資訊,它和 C++ 中的 RTTI(Runtime Type Information) 的作用是差不多的。
為了能夠使用反射,需要在專案中引用 System.Reflection 名稱空間,在使用反射的開始,你會獲取一個 Type 型別的物件,從這個物件上進一步獲取 程式集,型別,模組 等資訊,可以透過 反射 動態的生成某個型別的例項,甚至還能動態呼叫這個型別上的方法。
在 System.Reflection 名稱空間下,定義瞭如下幾大核心型別。
Assembly Module Enum MethodInfo ConstructorInfo MemberInfo ParameterInfo Type FieldInfo EventInfo PropertyInfo
現在我們一起研究一下怎麼使用,考慮下面定義的 Customer 類。
public class Customer { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } }
下面的程式碼片段展示瞭如何透過 反射 來獲取 Customer 的類名以及 Customer 的所屬名稱空間。
class Program { static void Main(string[] args) { Type type = typeof(Customer); Console.WriteLine("Class: " + type.Name); Console.WriteLine("Namespace: " + type.Namespace); } }
再看一個例子,如何透過反射獲取 Customer 下的所有屬性,並且將屬性名字全部展示在控制檯上,如下程式碼所示:
static void Main(string[] args) { Type type = typeof(Customer); PropertyInfo[] propertyInfo = type.GetProperties(); Console.WriteLine("The list of properties of the Customer class are:--"); foreach (PropertyInfo pInfo in propertyInfo) { Console.WriteLine(pInfo.Name); } }
值得注意的是,typeof(Customer).GetProperties() 預設只能獲取 標記為 public 的屬性集合,對應著 Customer 類下的四個公開屬性。
接下來再來看看如何透過 反射 獲取型別下的 建構函式 和 公共方法 的後設資料資訊,這裡還是繼續使用 Customer 類,在類中新增一個 建構函式 和一個 Validate 方法,此方法用於校驗入參的合法性,下面就是修改後的 Customer 類。
public class Customer { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } public Customer() { } public bool Validate(Customer customerObj) { //Code to validate the customer object return true; } }
然後再來看看透過 反射 來獲取 Customer 下所有定義的建構函式,不過這裡只定義了一個建構函式,因此只能列出一個。
class Program { static void Main(string[] args) { Type type = typeof(Customer); ConstructorInfo[] constructorInfo = type.GetConstructors(); Console.WriteLine("The Customer class contains the following Constructors:--"); foreach (ConstructorInfo c in constructorInfo) { Console.WriteLine(c); } } }
同樣也要注意,預設情況下 GetConstructors() 方法只能獲取 Customer 的所有標記為 public 的建構函式。
接下來看看如何展示 Customer 中的所有 public 方法,因為該類中只定義了一個 public 方法,所以控制檯上也應該只會展示一個,如下程式碼僅供參考。
static void Main(string[] args) { Type type = typeof(Customer); MethodInfo[] methodInfo = type.GetMethods(); Console.WriteLine("The methods of the Customer class are:--"); foreach (MethodInfo temp in methodInfo) { Console.WriteLine(temp.Name); } Console.Read(); }
是不是很驚訝,剛才還說是一個方法,居然多了好幾個,要知道多的那幾個方法,來自於兩方面。
從 object 型別繼承下來的公共方法
編譯器自動生成的屬性方法
如果方法上面標記了 Attribute, 還可以透過 GetCustomAttributes 方法來獲取,參考程式碼如下:
static void Main(string[] args) { foreach (MethodInfo temp in methodInfo) { foreach (Attribute attribute in temp.GetCustomAttributes(true)) { //Write your usual code here } } }
相信在你的應用程式中,經常會在 領域實體 上使用各種 Attribute 特性,這時候就可以透過上面的程式碼反射提取 領域實體 中的方法上的Attribute資訊,從而根據提取到的 Attribute 執行你的具體業務邏輯。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2757275/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#反射C#反射
- C# 反射(Reflection)C#反射
- 如何在C#中使用MSMQC#MQ
- 如何在 C# 中使用 ChannelsC#
- C#反射優化C#反射優化
- c# 反射呼叫方法C#反射
- 如何在C#專案中使用NHibernateC#
- 如何在C#中使用Google.Protobuf工具C#Go
- C# 反射/對映學習C#反射
- C#高階–反射詳解C#反射
- 什麼是C#反射(Reflection)C#反射
- Unity C# 反射效能優化UnityC#反射優化
- 如何在C#中除錯LINQ查詢C#除錯
- 如果你在使用async,就進來看看吧
- 詳解C#特性和反射(四)C#反射
- 詳解C#特性和反射(三)C#反射
- C#反射的委託建立器C#反射
- 詳解C#特性和反射(二)C#反射
- 詳解C#特性和反射(一)C#反射
- C# 反射呼叫擴充類方法C#反射
- C# - 如何在 MVVM 中處理 XAML 鍵盤?C#MVVM
- 如何在C#/.NET Core中使用責任鏈模式C#模式
- C#通過反射獲取類中的方法和引數個數,反射呼叫方法帶引數C#反射
- C# 反射 + Quartz,實現流程處理C#反射quartz
- 【C#】反射的用法及效率對比C#反射
- 如何使用反射反射
- 反射基本使用反射
- C# 中的“智慧列舉”:如何在列舉中增加行為C#
- c# 反射專題—————— 介紹一下是什麼是反射[ 一]C#反射
- 如何使用 C# 中的 ValueTaskC#
- 如何使用 C# 中的 LazyC#
- .Net 中的反射(反射特性) - Part.3反射
- 為什麼選擇使用介面(如List)而不是具體實現(如ArrayList)來宣告集合變數?-AI變數AI
- Kotlin中的反射Kotlin反射
- Swift中的反射Swift反射
- c# 類的反射例項 (GetType().Invoke().GetMethod().CreateInstance())C#反射
- C# 反射與特性(十):EMIT 構建程式碼C#反射MIT
- 反射的妙用:C#通過反射動態生成型別繼承介面並實現反射C#型別繼承