编译时检查一个值以实现多个接口

Kos*_*Kos 4 c# types interface

假设我想表达" 一种期望实现IFoo和IBar接口的对象的方法 ".就像是:

void Method(IFoo+IBar param);
Run Code Online (Sandbox Code Playgroud)

我怎么能用C#说这个?

(是否存在语法结构?或者是一个好习惯?)


一次尝试

介绍一个界面:

interface IFooBar : IFoo, IBar {}

void Method(IFooBar param);
Run Code Online (Sandbox Code Playgroud)

这很糟糕,我后悔甚至想到它:-)乍一看看起来很好,但可悲的部分是默默地引入了一个不应该在这里的依赖.

IFooBar存在的唯一原因是成为Method界面的一部分.因此,要用作Method参数的任何类对象必须知道此方法(和该接口)存在 - 否则不会出现这种情况.实现IFoo和IBar的所有类都需要修改以实现IFooBar(可能了解新的程序集) - 这是非常不切实际的,如果我们无法修改它们甚至是不可能的.

不必要的依赖=不禁.

解决方法

放弃静态输入:

void Method(object param)
{
    if (!param is IFoo)
        throw new ArgumentException("IFoo not supported", "param");
    if (!param is IBar)
        throw new ArgumentException("IBar not supported", "param");

    // ...
}
Run Code Online (Sandbox Code Playgroud)

(或:在签名中定义一种类型并动态检查其他类型 - 如果一个是最重要的,则更可取,但更令人困惑)

工作正确,但在运行时(没有编译时检查).迫切需要一个doc(每个人都要阅读它).

也仅适用于功能参数.如果我试图在一个字段上使用它,那么代码会因为强制转换而大量膨胀.


这种情况的真实案例?例如IList<Foo>+ INotifyCollectionChanged.

Ser*_*rvy 9

public void someMethod<T>(T param) where T : IFoo, IBar
{...}
Run Code Online (Sandbox Code Playgroud)