试图通过反思获得文字

本文关键字:文字 | 更新日期: 2023-09-27 18:19:58

假设我有以下代码:


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

基于此,我试图检索的是从构造函数发送到TypeId"A"《B》

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

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

我正在考虑声明常量来保存值,然后强制执行命名规则,这样我就可以稍后使用反射来获取并返回。类似。。。

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

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

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

不管怎样,我正在寻找替代方案。欢迎任何想法。

试图通过反思获得文字

救援属性!

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

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