从具有继承的类型中获取 属性 值

Get property value from type with inheritance

我有一些类型,它们继承自 ID 为 getter 的简单接口。 我在管理器的注册中使用这种类型,比如

Register<OpenDocumentLink>("DOCUMENT_OPEN");

与创作:

var ruleId = "DOCUMENT_OPEN";
MakeNewLink(ruleId);

我想从类型 访问 ID getter,例如:

Register<OpenDocumentLink>(OpenDocumentLink.ID);

编译器应该要求在每个 class.

中实现 ID getter

一些代码:

public interface ILink
{
    string ID { get; }
    void Execute();
}

class OpenDocumentLink : ILink
{
    public string ID
    {
        get { return "DOCUMENT_OPEN"; }
    }

    public void Execute()
    {
    }
}

据我所知,没有 "magic" 解决方案。如果您希望可以通过 class 实例访问您的字段,则需要 属性 是静态的。但是,继承或接口不适用于 C# 中的静态类型。

简单的答案是:您需要通过治理来实施它。您可以为此使用属性或静态 属性。如果您选择一个属性,您可以在应用程序启动时使用反射来发现这些模块并仅注册有效的模块(或在运行时抛出异常)。您还可以使用 Lint (FxCop) 之类的东西来确保始终遵循规则。

你基本上想要的是一个 "static" 界面,这意味着

interface ILink
{
    static string ID { get; }
}
class OpenDocumentLink : ILink
{
    public static string ID { get { return "DOCUMENT_OPEN"; } }
}

不幸的是,这在 C# 中是不可能的。你能考虑像

这样的函数吗
public void Register<TLink>(TLink link) where TLink : ILink

然后只传递一个完整的 new OpenDocumentLink 对象?让我觉得奇怪的是你带了一个类型参数(OpenDocumentLink),你还必须传递ID字符串,但ID字符串似乎与类型是一一对应的。也就是说,如果您知道类型,您也会知道 ID - 那么为什么要将 ID 作为参数传递?

考虑重新评估您需要从您的类型中得到什么。您会传递更多信息而不仅仅是 ID 吗?如果是这样,传递一个实现 ILink 的 class 实例。 ID 是您需要传递的唯一参数吗?如果是这样,也许做一个枚举,例如MakeNewLink(LinkId.OpenDocument).

如果这没有帮助,最好能提供有关您要解决的问题的更多信息。