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



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

接口IFoo{void Foo();}delegate void ActionByRef<T>(参考T参数)_;

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

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

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

例如,如果你有一个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);

最新更新