2008-12-27 64 views
0

我遇到反射問題。我需要找到實例化靜態成員的類型。我的代碼如下所示:.NET反射 - 查找定義靜態成員的類型

private class SimpleTemplate : PageTemplate 
    { 
     internal static readonly IPageProperty NameProperty = 
      PropertyRepository.Register("Name"); 
    } 

PropertyRepository是屬性(顯然)的存儲庫。它跟蹤所有使用我正在構建的類型系統註冊的屬性。

爲了成功地做到這一點,我需要跟蹤所有屬性,但也要跟蹤它們的定義類型。否則,如果定義了兩個具有相同名稱的屬性,則屬性存儲庫將無法區分它們。

所以,我想要做的是找出定義NameProperty的類型並存儲類型以及名稱。我怎樣才能做到這一點?

我想使用強類型,即我不想將類型作爲參數發送到PropertyRepository.Register。這會很容易出錯,因爲我無法驗證類型參數是否正確。

我想,解決方案將涉及反思。有什麼方法可以使用反射來確定哪種類型調用靜態方法?靜態屬性使用靜態構造函數(編譯器生成)隱式實例化。有沒有辦法讓我得到該構造函數的句柄?這似乎是可行的,我只是無法弄清楚如何做到這一點。換句話說:如果方法A調用方法B,有沒有什麼方法可以告訴它使用反射從A調用它?我想象那裏,但我無法找到如何。

有誰知道嗎?我看着StackFrame類,雖然它似乎做我想做的,它可能不是可靠的生產代碼(我需要)。

回答

2

這是this question幾乎重複,但不是相當。儘管如此,請看那個人的答案。

我個人認爲我會通過這種類型。另一種方法是使用屬性,例如然後

[PropertyName("Name")] 
private static readonly IPageProperty NameProperty = null; 

static 
{ 
    PropertyRepository.RegisterProperties(typeof(SimpleTemplate)); 
} 

PropertyRepostiory.RegisterProperties可以設置使用反射只讀字段的值(如果這個工程 - 我還沒有嘗試過,只讀的煩躁可能會強制執行)。雖然......有點瑣碎......或者,您可以在需要時從存儲庫中獲取屬性。

+0

是的,您指出的鏈接顯然有幫助。你的評論讓我意識到有一個更簡單的方法來做到這一點,即使它不會完全符合你的建議。謝謝! – Karl 2008-12-27 20:02:24