1

2 つの異なる無関係なアセンブリがデリゲート型やインターフェイス型を使用したい場合 (例:

インターフェイス IFoo {void Foo(); }
デリゲート void ActionByRef<T>(ref T param)_;

IFooそれぞれ独自の目的のために、しかし、それらの両方を使用する 3 番目のアセンブリが 2つのアセンブリ間でオブジェクトを渡したい可能性がありますActionByRef<T>。他?.net はデリゲート型に単純な構造的等価性を使用しないことを知っています (つまり、両方の型が同じシグネチャを持つ関数を表している場合でも、 a を期待するルーチンは aFunc<int,bool>を受け入れませんPredicate<int>)、正確なルールは何ですか? アセンブリを .net 2.0 および 4.0 と互換性があるように設計し、3 つのパラメーターを持つメソッドのデリゲートを受け入れるようにしたい場合、定義する方法はありますか?Action<T1,T2,T3>アセンブリが.net 2.0プログラムにリンクされたときに組み込みのものを使用するようにしますが、.net 4.0とリンクされたときに同じ名前のフレームワーク定義のデリゲートのパラメーターを受け入れますか?

4

1 に答える 1

2

一方のアセンブリによって公開されたIFooまたはActionByRefをもう一方のアセンブリへの入力として受け入れる必要があると.netが判断するには、何が必要ですか?

.NETは、 fromアセンブリBが予期されIFooているfromアセンブリAを受け入れることはありません。IFoo同じ名前であっても、2つの異なるタイプです。2つの間にアダプタを作成する必要があります。

たとえば、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 に答える