假设我有以下代码:
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是否已经声明,以及它们是否在编译期间得到了正确的名称。
实际上,如果语言有某种静态继承,这在这种情况下会有很大帮助,但是我听到一些程序员抱怨静态继承更像是一种头疼而不是治愈。
无论如何,我正在寻找其他选择。任何想法都是受欢迎的。
答案 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 ) { ... }
}
此解决方案的主要好处是将所有字符串文字收集到一个中心位置。或者,使用抽象超类。