【问题标题】:Ensure mutually exclusive interfaces at compile-time?在编译时确保互斥接口?
【发布时间】:2011-08-21 16:25:44
【问题描述】:

我想确保在编译时永远不会在同一个类上找到两个接口,类似于 AttributeUsage 在编译时检查自定义属性的方式。

例如:

[InterfaceUsage(MutuallyExclusive = typeof(B))]
interface A {
    //...
}

interface B {
    //...
}

class C : A, B { //should throw an error on compile time
    //...
}

我显然可以在运行时通过反射来做到这一点,但我对编译时解决方案感兴趣。

我想可能不存在开箱即用的属性 - 但有没有一种方法可以创建在编译时运行的自定义属性,就像 AttributeUsage 一样?

【问题讨论】:

  • 不只是普通的 C# 编译器...
  • 你可以建立一个 FxCop 规则。
  • 可以用抽象类代替接口吗?
  • 我会考虑重新考虑您的对象模型,即使用组合而不是继承。如果某个东西不能同时是 ICat 和 IDog,那么它们不应该是接口。
  • 您可能会从编译时解决方案中获得递减收益。 .Net 框架不会试图阻止用户做出不合逻辑的接口实现选择,您也不应该这样做!如果绝对有必要,一些运行时检查是可以的,但实际上,如果用户想要不遗余力地实现一些愚蠢的东西(例如假设的 IQueueIStackIDictionary 一直来自LinkedList)你应该让他们。

标签: c# attributes custom-attributes compile-time


【解决方案1】:

给他们两个签名相同但返回类型不兼容的方法怎么样?

【讨论】:

  • 我认为这更像是一个警告,因为他们可以显式地实现其中一个接口。虽然我很确定如果没有外部工具,您将无法做得更好。
【解决方案2】:

另一种方法是将它们更改为抽象类。

【讨论】:

    猜你喜欢
    • 2012-05-16
    • 2016-09-15
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    相关资源
    最近更新 更多