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