如果两个不同的无关组件希望使用委托和/或接口类型(例如
)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链接时会接受框架定义的同名委托的参数吗?
答案 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);