簡體   English   中英

嘗試通過反射獲取文字

[英]Trying to get a literal via reflection

假設我有以下代碼:


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") {}
}

超級容器B.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!") {}
}

基於此,我嘗試檢索的是從構造函數發送到TypeId“ A”“ B”

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

是否可以使用反射來檢查我的源代碼和/或程序集的文字? (如果可以看到類似源代碼的內容,則可以使用Regex來獲取值。)(注:不能將源作為資源文件包含到程序中:P)

我正在考慮聲明常量以保留該值並在那時強制使用命名規則 ,以便稍后可以使用反射來獲取然后返回。 就像是 ...

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

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

...但是我不確定這是否是解決此問題的最佳方法,因為我沒有任何幫助來檢查這些const是否已聲明以及它們在編譯時是否具有正確的名稱。

實際上,如果該語言具有某種靜態繼承,那么在這種情況下這將有很大幫助,但是我聽說有些程序員抱怨靜態繼承更多是頭痛而不是治愈。

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

救援的屬性!

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;

為什么不簡單地使用具體類型來查找您想要與之關聯的字符串值?

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

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

此解決方案的主要好處是將所有字符串文字收集在一個中央位置。 或者,使用抽象超類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM