來看看如何在 C# 中使用反射

大雄45發表於2021-02-15
導讀 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); 
       } 
   }

來看看如何在 C# 中使用反射來看看如何在 C# 中使用反射
再看一個例子,如何透過反射獲取 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); 
            } 
        }

來看看如何在 C# 中使用反射來看看如何在 C# 中使用反射
值得注意的是,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); 
            } 
        } 
    }

來看看如何在 C# 中使用反射來看看如何在 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(); 
       }

來看看如何在 C# 中使用反射來看看如何在 C# 中使用反射
是不是很驚訝,剛才還說是一個方法,居然多了好幾個,要知道多的那幾個方法,來自於兩方面。

從 object 型別繼承下來的公共方法
來看看如何在 C# 中使用反射來看看如何在 C# 中使用反射

編譯器自動生成的屬性方法
來看看如何在 C# 中使用反射來看看如何在 C# 中使用反射

如果方法上面標記了 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章