2009-06-03 6 views
15

は私がアクション<T>をFunc <T,Tres>に変換する最良の方法は何ですか?

public static TResult Execute<TResult>(Func<T, TResult> remoteCall); 
public static void Execute(Action<T> remoteCall) 

がどのように私は最初の1に第2の方法では、同じデリゲートを渡すことができ、この署名と私のクラスの二つの機能を持っていますか? Delegate引数を使用してメソッドを作成する方法はありません。例外情報が失われているからです。
ありがとうございます!

答えて

30

タイプFunc<T, TResult>のデリゲートにダミーの戻り値を入れてラップします。

public static void Execute(Action<T> remoteCall) 
{ 
    Execute(t => { remoteCall(t); return true; }); 
} 
8

あなたは文字通り、それが必要な機能に結果を提供しないものを渡すように求めています。
これは無意味です。

あなたには、いくつかの結果の値(暗黙的または明示的に)供給して喜んでいる場合は、簡単にFunc<T,TResult>

Func<T,TResult> MakeDefault<T,TResult>(Action<T> action) 
{ 
    return t => { action(t); return default(TResult);}; 
} 

または

Func<T,TResult> MakeFixed<T,TResult>(Action<T> action, TResult result) 
{ 
    return t => { action(t); return result; }; 
} 
を形成 Action<T>の任意の関数に変換することができます
関連する問題