[ASP.NET]SampleCode - Reflection

  • 3248
  • 0

[ASP.NET]SampleCode - Reflection

起源:小鋪裡的一則發問,『將struct 直接轉成datatable』,原發問者希望

可以動態及定義DataTable的欄位名稱等資料,這樣的需求可以利用Reflection

的技巧來達成,在此先不探討這樣的需求跟設計面議題

 

Reflection提供程式在執行階段期間可以解析Object的技術,利用Reflection機制

可以取得Object相關Field、Event、Property、Parameter等相關資訊,更詳細的

說明可以參考MDSN文件說明,以下節取一部份重點

 

  • 使用 Assembly 定義並載入組件、載入組件資訊清單 (Assembly Manifest) 中列出的
    模組,和從這個組件找出型別並建立它的執行個體。
  • 使用 Module 探索資訊,例如包含模組和模組中類別的組件。您也可以取得所有全域
    方法或是在模組上定義的其他特定非全域方法。
  • 使用 ConstructorInfo 探索資訊,例如名稱、參數、存取修飾詞 (例如 public 或 private)
    ,以及建構函式的實作 (Implementation) 詳細資訊 (例如 abstract 或 virtual)。使用 Type
    的 GetConstructors 或 GetConstructor 方法,叫用特定的建構函式。
  • 使用 MethodInfo 探索資訊,例如名稱、傳回型別、參數、存取修飾詞 (例如 public 或
    Private),以及方法的實作詳細資訊 (例如 abstract 或 virtual)。使用 Type 的 GetMethods
    或 GetMethod 方法,叫用特定方法。
  • 使用 FieldInfo 探索資訊,例如名稱、存取修飾詞 (例如 public 或 private),以及欄位的實作
    詳細資訊 (例如 static),並取得或設定欄位值。
  • 使用 EventInfo 探索資訊,例如名稱、事件處理常式資料型別、自訂屬性、宣告型別和事件
    的反映型別,並加入或移除事件處理常式。
  • 使用 PropertyInfo 探索資訊,例如名稱、資料型別、宣告型別、反映型別和屬性的唯讀或可
    寫入狀態,並取得或設定屬性值。
  • 使用 ParameterInfo 探索資訊,例如參數的名稱、資料型別、參數是否為輸入或輸出參數,和
    方法簽章 (Signature) 中參數的位置。
  • 使用 CustomAttributeData 探索在應用程式定義域的僅限反映內容中工作時,關於自訂屬性的
    資訊。CustomAttributeData 讓您可以檢查屬性,而不需要建立這些屬性的執行個體。

 

在理解Reflection可以為我們做什麼之後,回到這個需求本身就不難解決了,只要能把struct 相關FieldInfo

利用Reflection於runtime階段取出,那麼動態及定義DataTable的欄位名稱等資料也就小事一件了

 

範例程式如下:

public struct EmpData
{
    public string EmpNo;
    public string EmpName;
}

protected void Page_Load(object sender, EventArgs e)
{
    EmpData empdata = new EmpData();
    empdata.EmpNo = "A001";
    empdata.EmpName = "Ian";

    Type t = empdata.GetType();

    foreach (FieldInfo item in t.GetFields())
    {
        Response.Write(string.Format("FieldType:{0} / Name:{1} / Value:{2}<br>", item.FieldType, item.Name, item.GetValue(empdata).ToString()));
    }
}

 

image

 

 

 

Ref:

反映概觀

反映 (C# 程式設計手冊)

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18