2011-12-26 10 views
1

のためのパラメータとして任意の方法を渡す方法を、私はクラスAでは、他の機能

internal void AFoo(string s, Method DoOtherThing) 
{ 
    if (something) 
    { 
     //do something 
    } 
    else 
     DoOtherThing(); 
} 

は今、私はAFoo()DoOtherThingに合格できるようにする必要がありますがあります。私の要件は、DoOtherThingは、ほとんど常に無効な戻り値の型を持つ任意の署名を持つことができるということです。クラスB、

void Foo() 
{ 
    new ClassA().AFoo("hi", BFoo); 
} 

void BFoo(//could be anything) 
{ 

} 

からこのような何か私がActionまたはデリゲートを実装することによってこれを行うことができます知っている(他の多くのSOの記事に見られるように)が、クラスB内の関数の署名がある場合はどのようにこれを達成することができました未知の??

+3

パラメータがある場合は、どのように関数を呼び出しますか? – erikH

+0

@erikHはロットから機能しますか? – nawfal

+0

@nawfal ???例えば、DoSomething(int、string)メソッドとして、いくつかの値を引数として必要とするでしょう... – erikH

答えて

8

delegateインスタンスを渡す必要があります。 Actionは正常に動作します:

internal void AFoo(string s, Action doOtherThing) 
{ 
    if (something) 
    { 
        //do something 
    } 
    else 
        doOtherThing(); 
} 

BFoo場合、それはあなたの例で記述されたように動作しますパラメーターなしです。

new ClassA().AFoo("hi", BFoo); 

それはパラメータを必要とする場合は、あなたがそれらを供給する必要があります:

new ClassA().AFoo("hi",() => BFoo(123, true, "def")); 
+0

純粋な輝きが、私が見ている通りに行く...コンパイル後の注釈:) – nawfal

0
public static T Runner<T>(Func<T> funcToRun) 
{ 
    //Do stuff before running function as normal 
    return funcToRun(); 
} 

使用法:私は私のMVCサイト上のエラー処理のためにこれを使用

var ReturnValue = Runner(() => GetUser(99)); 

関連する問題