【问题标题】:Is there a way to use interfaces to achieve a similar result?有没有办法使用接口来实现类似的结果?
【发布时间】: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 来读取字符串的值在应用程序的生命周期内不会改变。

由于接口,该属性在运行时可读,但需要类实例化。该常量不需要类实例化,但在运行时不可读,因为它不能定义为接口的成员。所以我陷入了一种先有鸡还是先有蛋的境地。

【问题讨论】:

  • 如何在配置中使用appsettingdocs.microsoft.com/fr-fr/dotnet/api/…
  • 您可以创建一个帮助类来存储此类常量或使用应用程序设置
  • 您的“类常量”作为属性会更好吗? [ClassConstant("Class Constant Value")] public class Class { ... }
  • 是否有原因它不能是接口上定义的只读属性,而只能让类通过属性返回常量?
  • 好的,我认为很明显这是一个 XY 问题。请退后一步告诉我们X是什么,而不是试图进一步追逐Y。这个常量做什么?为什么这样做?为什么其他代码需要常量?为什么你不知道你将使用哪些课程?

标签: c# reflection system.reflection c#-8.0


【解决方案1】:

感谢@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; }
}

【讨论】:

  • 现在您需要在任何地方实现该属性。也许简单的扩展方法会更好?
猜你喜欢
  • 2011-02-10
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多