C# 中的反射及其優缺點(學習心得 29)

反射指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。

程式集包含模組,而模組包含類型,類型又包含成員。

反射則提供了封裝 程式集、模組和類型 的對象。

可以使用反射,動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。

然後,可以調用類型的方法或訪問其欄位和屬性。

一、反射的優缺點

優點:

  • 1、反射提高了程式的靈活性和擴展性。
  • 2、降低耦合性,提高自適應能力。
  • 3、允許程式創建和控制任何類的對象,無需提前硬編碼目標類。

缺點:

  • 1、性能問題:使用反射基本上是一種解釋操作,用於欄位和方法接入時要遠慢於直接程式碼。因此反射機制主要應用在對靈活性和拓展性要求很高的系統框架上,普通程式不建議使用。
  • 2、使用反射會模糊程式內部邏輯;程式設計師希望在源程式碼中看到程式的邏輯,反射卻繞過了源程式碼的技術,因而會帶來維護的問題,反射程式碼比相應的直接程式碼更複雜。

二、反射的用途

反射(Reflection)有下列用途:

  • 它允許在運行時查看特性(attribute)資訊。
  • 它允許審查集合中的各種類型,以及實例化這些類型。
  • 它允許延遲綁定的方法和屬性(property)。
  • 它允許在運行時創建新類型,然後使用這些類型執行一些任務。

三、查看元數據

使用反射(Reflection)可以查看特性(attribute)資訊。

System.Reflection 類的 MemberInfo 對象需要被初始化,用於發現與類相關的特性(attribute)。

為了做到這點,您可以定義目標類的一個對象:

System.Reflection.MemberInfo info = typeof(MyClass);

例:查看自定義特性

using System;

[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute
{
   public readonly string Url;

   public string Topic  // Topic 是一個命名(named)參數
   {
      get
      {
         return topic;
      }
      set
      {
         topic = value;
      }
   }

   public HelpAttribute(string url)  // url 是一個定位(positional)參數
   {
      this.Url = url;
   }

   private string topic;
}

[HelpAttribute("Information on the class MyClass")]
class MyClass
{
}

namespace AttributeAppl
{
   class Program
   {
      static void Main(string[] args)
      {
         System.Reflection.MemberInfo info = typeof(MyClass);
         object[] attributes = info.GetCustomAttributes(true);
         for (int i = 0; i < attributes.Length; i++)
         {
            System.Console.WriteLine(attributes[i]);
         }
         Console.ReadKey();

      }
   }
}

運行結果:

HelpAttribute
Tags: