是否有使用接口的方法来获得相似的结果?

问题描述 投票:0回答:1

我有一个应用程序,该应用程序在启动时使用反射来动态引用应用程序中的类型。

我的每个类型都有一个这样定义的常量:

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只是为了读取一个字符串值,在应用程序的生存期内不会更改。

由于界面的缘故,该属性在运行时可读,但需要实例化。该常量不需要类实例化,但是在运行时期间不可读,因为它不能定义为接口的成员。所以我陷入了鸡蛋和鸡蛋的困境。

c# reflection system.reflection c#-8.0
1个回答
0
投票

感谢@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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.