2017-11-08 7 views
-1

デリゲートの関数シグネチャをコード内に既に置いているときは、関数シグネチャを2回宣言しないでください。私は明らかに何かを見逃しているように感じるが、私はグーグルでこれを行う方法を見つけることができないようだ。C#は既存の関数からデリゲートシグネチャを宣言します

public class SomeLibraryV1 
{ 
    public int DoSomething(int x, int y); 
} 

public class SomeLibraryV2 
{ 
    public int DoSomething(int x, int y); 
} 

public class SomeConsumer 
{ 
    // Create the delegate by manually declaring the signature again :-(
    private delegate int DoSthDelegate(int x, int y); 

    public void Run(DoSthDelegate aDelegate) 
    { 
    aDelegate(1, 2); 
    } 
} 

だから私はちょうどint fn(int, int)の2番目の宣言を避けているやってみたいものを。

public class SomeConsumer 
{ 
    // Create the delegate from the function signature we already know :-) 
    public delegate DoSthDelegate(SomeLibrary.DoSomething); 

    public void Run(DoSthDelegate aDelegate) 
    { 
    aDelegate(1, 2); 
    } 
} 

このようなものは、二回ごとに1つの宣言を入力して、私を救うだけでなくDoSomething変更の署名すべき2つの場所で物事を維持する必要が私を救うでしょう。

+0

Funcを取る? –

+0

OK、SomeLibrary.DoSomethingの宣言からどうやって取得できますか? –

+1

私はあなたが何を意味しているのか理解していますが、実行する前にこれを行う方法がわかりません。私はあなたがここで明白でなければならないと思う。しかし、 '' 'Func <>' ''はあなたにいくつかの入力を省くかもしれません。 –

答えて

0

代理人には、重要な点を言わないために、あなたは肯定的な表現を欠いています。 メソッドを同じ署名で登録することができます。したがって、デリゲートをただ1つの修正メソッドにバインドするのは本当に役に立ちません。同じメソッドを呼び出すだけの場合は、デリゲートを使用しないでください。単純に呼び出すあなたDoSomethingはなく、直接、デリゲートを呼び出すあなたのRun -methodに-method:実際には

Run() 
{ 
    var retVal = DoSomething(3, 5) 
} 

デリゲートは、同様に複数の方法によりsatisifiedすることができる署名以外の何ものでもありません。さらに、これは同じデリゲート定義で複数のイベントハンドラを登録できるイベントの基礎です。

したがって、すべてのデリゲートは、2つのint値を必要とし、intを返すメソッドがあることを示すためにそれを行います。しかし、それはdoesn'tこのメソッドが定義されている場所に任意の仮定を作る - それはまた、匿名の1、例えば:もちろん

Run((x, y) => x + y); 

これは、いくつかの重複タイピングあるかもしれません。ただし、デリゲートの署名に合致しないメソッドを呼び出すことはできません。だから、あなたが行うことができる唯一のことは、あなた自身のものを作成するのではなく、Func -delegateを使用することです:

public TheFunc Func<int, int, int> { get; set; } 

あなたはこの文を経由してこれを設定することができます

Run(instanceOfMyLibrary.DoSomething); 

かも:

Func<int, int, int> f = instanceOfyLibrary.DoSomething; 
Run(f); 

NB:代理人はRunのメソッドにパラメータとして提供するにはpublicである必要があります。

+0

明らかに、私はデリゲートを使用する実際の理由があります。あなたはその質問に対する答えを持っていますか? SomeLibrary.DoSomethingの署名からTheFuncを作成するにはどうすればよいですか? –

+0

私はデリゲートの宣言について話していますが、今それを呼び出す方法... –

+0

あなたは 'DoSomething'を実行したいとは思わないが、' SomethingDifferent'。デリゲートのポイントは、署名を満たす*両方の* DoSomethingまたは 'SomethingDifferent'の両方を呼び出すことができることです。デリゲートを修正メソッドにバインドすると、デリゲートは完全に役に立たなくなります。あなたがデリゲートの署名*を明示的に*定義する必要があります。 – HimBromBeere

関連する問題