2016-10-27 4 views
-1

こんにちは私は、関数Tを受け入れてそれを呼び出す汎用関数を作りたいと思います。例えば別の関数と異なるシグネチャを渡す関数c#

: 魔法の機能は、この

public void Test() 
{ 
    InvokeFunction(Test1, "st", "sn"); 
    InvokeFunction(Test2, 7); 
} 

public void InvokeFunction(Function f) 
{ 
    f(); 
} 

public void Test1(string sT, string sFN) 
{ 
    Console.WriteLine(sT + " : " + sFN); 
} 

public string Test2(int p) 
{ 
    return p + ""; 
} 

ようにする必要があり、それを実行する方法はありますか?もしそうなら、どのように?

ありがとうございます!

+0

チェックhttp://stackoverflow.com/questions/9410/how-do-you-pass-a-function-as-a-parameter-in-c –

答えて

1

あなたはActionとしてこれを行うことができますが、目的の引数を持つメソッドを呼び出すラムダを渡す必要があります。

public void Test() 
{ 
    InvokeFunction(() => Test1("st", "sn")); 
} 

public void InvokeFunction(Action f) 
{ 
    f(); 
} 

public void Test1(string sT, string sFN) 
{ 
    Console.WriteLine(sT + " : " + sFN); 
} 

しかし、あなたの方法はあなたがそのためのFuncを使用して別の一般的な方法を必要があると思いたい戻り値を持っている場合。

public void Test() 
{ 
    var result = InvokeFunction(() => Test2(7)); 
    Console.WriteLine(result); 
} 

public T InvokeFunction<T>(Func<T> f) 
{ 
    return f(); 
} 

public string Test2(int p) 
{ 
    return p + ""; 
} 
+0

ありがとうございました! 私はvoidを返し、値を返しますか?それはまだ可能ですか? writeが無効で、readが値 – dan

+0

を返した場合@dan確かに、両方のオーバーロードを必要とするか、より良いことにそれらに別々の名前、おそらく 'InvokeFunction'と' InvokeAction'を与える必要があります。 。 – juharr

+0

すごくありがとう! – dan

0

メソッドの戻り値または無効な値があります。したがって、2つの汎用関数が必要です。

TValue InvokeFunction<TValue>(Func<TValue> func) 
{ 
    return func(); 
} 

void InvokeFunction(Action func) 
{ 
    func(); 
} 

使用法、

var result = InvokeFunction(() => Test2(3)); 
InvokeFunction(() => Test1("p1", "p2")); 
関連する問題