2012-01-10 55 views
1

假設我有一個下面的代碼:嘗試通過反射來獲取文字


Container.cs

public class Container 
{ 
    public readonly string IdType; 

    public Container(string aIdType) 
    { 
     IdType = aIdType; 
    } 
} 

SuperContainerA的.cs

public class SuperContainerA : Container 
{ 
    public SuperContainerA(/*x parameters*/) : base("A") {} 
} 

SuperCont ainerB.cs

public class SuperContainerB : Container 
{ 
    public SuperContainerB( /*y parameters*/) : base("B") {} 
} 

SuperContainerToTheInfinityAndBeyond.cs

public class SuperContainerB : Container 
{ 
    public SuperContainerB( /*y parameters*/) : base("It's Over 9000!") {} 
} 

此基礎上,我想要檢索的是「A」「B」它們正從構造函數發送到TypeId

這裏的問題是......我需要在程序初始化期間檢索這些值,然後創建這些類的實例,所以我認爲在這裏使用反射是我最好的選擇。 (注意:如果每個構造函數的參數個數是相同的,創建類的實例將是有效的,但它們可以改變。:()

是否可以使用反射來檢查(如果我能看到類似於源代碼的東西,那麼我可以使用正則表達式來獲取它的值)。(注意:包括源代碼爲資源文件對我的程序不是一個選項:P)

我想聲明常數持有的價值和上那麼命名規則,這樣我就可以使用反射後搶回來,然後如此。 mething像...

public class SuperContainerA 
{ 
    public const string ctIdType = "A"; 
} 

public class SuperContainerB 
{ 
    public const string ctIdType = "B"; 
} 

...但我不知道這是否是對這個問題的最好方法,因爲我不會有什麼幫我查一下,如果這些consts已經宣佈,如果他們在編譯期間得到了正確的名字。其實,如果語言有某種靜態繼承,這在這種情況下會有很大的幫助,但是我聽到一些程序員抱怨說,靜態繼承更像是一種頭痛,而不是一種治療。

無論如何,我正在尋找替代品。任何想法是受歡迎的。

+1

你究竟想要做什麼?在創建對象之前從瞭解這些值中獲得什麼好處? – cadrell0 2012-01-10 13:51:52

回答

4

屬性的救援!

public class IdTypeAttribute: Attribute 
{ 
    public string IdType { get; private set; } 

    public IdTypeAttribute(string idType) 
    { 
     IdType = idType; 
    } 
} 

[IdType("B")] 
public class SuperContainerB: Container 
{ 
    // whatever you like... 
} 

然後,您可以通過反射訪問屬性。容易做...

var type = typeof(SuperContainerB); 
var attribute = (IdTypeAttribute)type.GetCustomAttributes(
    typeof(IdTypeAttribute), false)[0]; 
var idType = attribute.IdType; 
+1

+1表示您的答案,就好像它是一個超級英雄。 – ean5533 2012-01-10 14:36:40

+0

完全忘了屬性。是的,他們將成爲這個特殊問題的一條很好的逃生路線。你也可以獲得一些編譯時間驗證。謝謝。 – Canella 2012-01-11 10:31:52

1

爲什麼不簡單地使用具體類型來查找您似乎想要與它關聯的字符串值?

public class SuperA : Container 
{ 
    public string IdType { get { return IdTypeFactory.Get(GetType()); } } 
} 

public static class IdTypeFactory 
{ 
    public static string Get(Type containerType) { ... } 
} 

該方案的主要優點是收集所有的字符串文字在一箇中心位置。或者,去抽象的超類。

+0

這是一個有效的選項,謝謝。我會考慮使用它。雖然我喜歡把東西放在一起,但這可能是一個很好的解決方案。 – Canella 2012-01-11 10:29:49