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

时间:2015-02-17 12:12:51

标签: c# interface

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

Register<OpenDocumentLink>("DOCUMENT_OPEN");

和创作:

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

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

Register<OpenDocumentLink>(OpenDocumentLink.ID);

编译器应该必需在每个类中实现ID getter。

一些代码:

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

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

    public void Execute()
    {
    }
}

2 个答案:

答案 0 :(得分:2)

你基本上想要的是一个“静态”界面,这意味着类似

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作为参数传递?

考虑从您的类型中重新评估您需要的内容。你会传递更多信息吗?如果是,则传递实现ILink的类的实例。 ID是您需要通过的唯一参数吗?如果是这样,可以制作一个枚举,例如MakeNewLink(LinkId.OpenDocument)

如果这无益,那么获得有关您要解决的问题的更多信息会很高兴。

答案 1 :(得分:0)

据我所知,没有&#34;魔法&#34;解。如果希望通过类实例访问字段,则需要将属性设置为静态。但是,继承或接口不适用于C#中的静态类型。

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