【发布时间】:2020-05-04 15:26:25
【问题描述】:
我有一个应用程序,它在启动时使用反射动态引用我的应用程序中的类型。
我的每个类型都定义了一个常量,如下所示:
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 来读取字符串的值在应用程序的生命周期内不会改变。
由于接口,该属性在运行时可读,但需要类实例化。该常量不需要类实例化,但在运行时不可读,因为它不能定义为接口的成员。所以我陷入了一种先有鸡还是先有蛋的境地。
【问题讨论】:
-
如何在配置中使用
appsetting:docs.microsoft.com/fr-fr/dotnet/api/… -
您可以创建一个帮助类来存储此类常量或使用应用程序设置
-
您的“类常量”作为属性会更好吗?
[ClassConstant("Class Constant Value")] public class Class { ... } -
是否有原因它不能是接口上定义的只读属性,而只能让类通过属性返回常量?
-
好的,我认为很明显这是一个 XY 问题。请退后一步告诉我们X是什么,而不是试图进一步追逐Y。这个常量做什么?为什么这样做?为什么其他代码需要常量?为什么你不知道你将使用哪些课程?
标签: c# reflection system.reflection c#-8.0