.net 如何确定接口或委托的类型标识

.net 如何确定接口或委托的类型标识,.net,interface,delegates,.net-assembly,.net,Interface,Delegates,.net Assembly,如果两个不同的无关程序集希望使用委托和/或接口类型(例如 接口IFoo{void Foo();} 委托无效操作byref(ref T param)\uu; 每个程序集都有自己的用途,但使用这两个程序集的第三个程序集可能希望在两个程序集之间传递对象,因此.net需要做些什么来决定一个程序集公开的IFoo或ActionByRef是否应被接受为另一个程序集的输入?我知道.net不使用简单的st委托类型在结构上的相等性(例如,期望函数的例程将不接受谓词,即使这两种类型表示具有相同签名的函数),但确切的规

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

接口IFoo{void Foo();} 委托无效操作byref(ref T param)\uu; 每个程序集都有自己的用途,但使用这两个程序集的第三个程序集可能希望在两个程序集之间传递对象,因此.net需要做些什么来决定一个程序集公开的
IFoo
ActionByRef
是否应被接受为另一个程序集的输入?我知道.net不使用简单的st委托类型在结构上的相等性(例如,期望
函数
的例程将不接受
谓词
,即使这两种类型表示具有相同签名的函数),但确切的规则是什么?如果希望设计一个与.net 2.0和4.0兼容的程序集,并让它接受一个具有三个参数的方法的委托,有没有办法定义一个
操作
,这样程序集在链接到.net 2.0程序时将使用其内置的一个,但会接受fram的参数与.net 4.0链接时,是否定义了同名的ework委托

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);
A.ActionByRef action1=。。。
B.ActionByRef action2=新的B.ActionByRef(action1);

这是否意味着,每当包含接口或委托的强名称程序集发生更改时,无论接口本身是否有任何实际更改,都必须重新编译接口或委托的所有使用者以包含新的强名称?如果不同强名称程序集中的两个接口需要相互引用?另外,您指定的委托构造函数语法听起来很有趣,但我只是尝试了一下,它似乎不起作用;委托类型的构造函数似乎坚持要接收方法组而不是委托;{A.ActionByRef temp=action1;action2=new B.ActionByRef((ref string st)=>temp(ref st));}它的源代码很难看,效率很低,需要为每对委托类型显式编写一个单独的转换器代码,而且非常讨厌。有更好的方法吗?@supercat,对于您的第一个问题:如果更改了强名称,则需要重新编译此程序集的使用者。但是,由于强名称是对于你的第二个问题:我刚刚试过,它对我有效(用C#5测试过,可能在早期版本中不起作用)。你也可以将
action1.Invoke
传递给构造函数;因为它是一个方法组,所以应该接受它。@supercat,关于“嵌套”代理,以下是如何避免它:
B.ActionByRef action2=(B.ActionByRef)Delegate.CreateDelegate(typeof(B.ActionByRef),action1.Target,action1.Method);
A.ActionByRef<string> action1 = ...
B.ActionByRef<string> action2 = new B.ActionByRef<string>(action1);