假设我有以下代码:
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/