如何为接口或委托确定类型标识

时间:2012-07-20 15:54:18

标签: .net interface delegates .net-assembly

如果两个不同的无关组件希望使用委托和/或接口类型(例如

interface IFoo {void Foo(); }
delegate void ActionByRef<T>(ref T param)_;

每个用于它自己的目的,但是使用它们的第三个程序集可能希望在两个程序集之间传递对象,.net需要发生什么来决定IFoo或{{应该接受一个程序集暴露的1}}作为另一个程序集的输入?我知道.net不会对委托类型使用简单的结构相等(意味着例如,期望ActionByRef<T>的例程将不接受Func<int,bool>,即使两种类型都表示具有相同签名的函数,但是具体规则是什么?如果有人希望设计一个与.net 2.0和4.0兼容的程序集,并让它接受一个带有三个参数的方法的委托,是否有任何方法可以定义Predicate<int>,以便程序集将使用它的内置-in当链接到.net 2.0程序时,但是当与.net 4.0链接时会接受框架定义的同名委托的参数吗?

1 个答案:

答案 0 :(得分:2)

  

.net需要做些什么来决定一个程序集暴露的IFoo或ActionByRef应该被接受作为另一个程序集的输入?

.NET永远不会接受来自程序集A的IFoo,其中预期来自程序集B的IFoo。它们是两种不同的类型,即使它们碰巧具有相同的名称。您需要在两者之间创建一个适配器。

e.g。如果你有一个A.IFoo并且需要在预期B.IFoo的地方传递它,你可以使用这个类:

class AToBFooAdapter : B.IFoo
{
    private readonly A.IFoo _foo;
    public AToBFooAdapter(A.IFoo foo)
    {
        _foo = foo;
    }

    public void Foo()
    {
        _foo.Foo();
    }
}

对于代表来说,这更容易;如果他们有相同的签名,你可以这样做:

A.ActionByRef<string> action1 = ...
B.ActionByRef<string> action2 = new B.ActionByRef<string>(action1);