试图通过反思获得文字

时间:2012-01-10 13:34:05

标签: c# .net

假设我有以下代码:


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

SuperContainerB.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 来自构造函数。

这里的问题是......在创建这些类的实例之前,我需要在程序初始化期间检索这些值,所以我认为使用反射是我最好的选择。 (注意:如果每个构造函数的参数数量相同,但是它们可以更改,则创建要检索值的类的实例将是有效的。:()

是否可以使用反射来检查源代码和/或程序集的文字? (如果我能看到类似源代码的内容,那么我可以使用Regex来获取值。)(注意:将源代码作为资源文件包含在我的程序中不是一个选项:P)

我正在考虑声明常量以保持值,然后强制 命名规则,这样我以后可以使用反射来抓取然后返回。有点像...

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

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

...但是我不确定这是否是解决这个问题的最佳方法,因为我没有任何东西可以帮助我检查这些consts是否已经声明,以及它们是否在编译期间得到了正确的名称。

实际上,如果语言有某种静态继承,这在这种情况下会有很大帮助,但是我听到一些程序员抱怨静态继承更像是一种头疼而不是治愈。

无论如何,我正在寻找其他选择。任何想法都是受欢迎的。

2 个答案:

答案 0 :(得分: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)

为什么不简单地使用具体类型来查找您想要与之关联的字符串值?

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

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

此解决方案的主要好处是将所有字符串文字收集到一个中心位置。或者,使用抽象超类。