我有一个应用程序,该应用程序在启动时使用反射来动态引用应用程序中的类型。
我的每个类型都有一个这样定义的常量:
public class Class : IClassInterface
{
public const string ClassConstant = "Class Constant Value";
}
在我的应用程序初始化期间,我这样通过反射访问该常量:
foreach (Type type in Assembly.GetExecutingAssembly().DefinedTypes)
if (typeof(IClassInterface).IsAssignableFrom(type))
{
string constantString = type.GetField("ClassConstant")?.GetRawConstantValue()?.ToString();
}
在我的应用程序中一个完全不同的位置,我需要再次检索该常数,这将要求我再次使用反射。似乎有点混乱,我想知道是否有人对我如何做这件事可能有所不同。
我最初尝试使用公共属性而不是常量,但是我发现该属性仅在实例化该类之后才可用,因此它要求我在每种类型上调用Activator.CreateInstance
只是为了读取一个字符串值,在应用程序的生存期内不会更改。
由于界面的缘故,该属性在运行时可读,但需要实例化。该常量不需要类实例化,但是在运行时期间不可读,因为它不能定义为接口的成员。所以我陷入了鸡蛋和鸡蛋的困境。
感谢@Christopher,此解决方案适用于我的使用情况:
public class Class : IClassInterface
{
public const string ClassConstant = "Class Constant Value";
public string Constant { get { return ClassConstant; } }
}
public interface IClassInterface
{
public string Constant { get; }
}