假设我有以下代码:



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


超级容器

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;

关于c# - 尝试通过反射获取文字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8804077/

10-13 08:19