1

如果两个不同的不相关程序集希望使用委托和/或接口类型(例如

接口 IFoo {void Foo(); }
委托 void ActionByRef<T>(ref T param)_;

每个都有自己的目的,但是使用它们的第三个程序集可能希望在两个程序集之间传递对象,.net 需要发生什么来决定应该接受一个程序集的IFoo或公开的作为输入ActionByRef<T>另一个?我知道 .net 没有对委托类型使用简单的结构相等性(这意味着例如期望 a 的例程Func<int,bool>将不接受 a Predicate<int>,即使两种类型都表示具有相同签名的函数),但确切的规则是什么?如果希望设计一个与 .net 2.0 和 4.0 兼容的程序集,并让它接受具有三个参数的方法的委托,有没有办法定义一个Action<T1,T2,T3>这样程序集在链接到 .net 2.0 程序时将使用其内置的程序集,但在与 .net 4.0 链接时将接受同名的框架定义委托的参数?

4

1 回答 1

2

.net 需要发生什么来决定应该接受一个程序集公开的 IFoo 或 ActionByRef 作为另一个程序集的输入?

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

例如,如果你有一个 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);
于 2012-07-20T16:07:53.767 回答