有没有办法使用接口来实现类似的结果?
Is there a way to use interfaces to achieve a similar result?
我有一个应用程序在启动时使用反射动态引用我的应用程序中的类型。
我的每个类型都有一个这样定义的常量:
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();
}
在我的应用程序中一个完全不同的地方,我需要再次检索该常量,这将需要我再次使用反射。它似乎有点乱,我想知道是否有人知道我如何做这件事,也许有点不同。
我最初尝试使用 public 属性 而不是常量,但我发现 属性 只有在 class 实例化后才可用,所以它要求我对每种类型调用 Activator.CreateInstance
只是为了读取在应用程序的生命周期内不会改变的字符串的值。
由于接口的存在,属性 在运行时是可读的,但需要 class 实例化。该常量不需要 class 实例化,但在运行时不可读,因为它不能定义为接口的成员。所以我陷入了先有鸡还是先有蛋的局面。
感谢@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; }
}
我有一个应用程序在启动时使用反射动态引用我的应用程序中的类型。
我的每个类型都有一个这样定义的常量:
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();
}
在我的应用程序中一个完全不同的地方,我需要再次检索该常量,这将需要我再次使用反射。它似乎有点乱,我想知道是否有人知道我如何做这件事,也许有点不同。
我最初尝试使用 public 属性 而不是常量,但我发现 属性 只有在 class 实例化后才可用,所以它要求我对每种类型调用 Activator.CreateInstance
只是为了读取在应用程序的生命周期内不会改变的字符串的值。
由于接口的存在,属性 在运行时是可读的,但需要 class 实例化。该常量不需要 class 实例化,但在运行时不可读,因为它不能定义为接口的成员。所以我陷入了先有鸡还是先有蛋的局面。
感谢@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; }
}