5

try/catch 機能を抽象化するメソッドを作成しました。これとまったく同じ try/catch シナリオを持つ約 30 のメソッドがあります。だから私はそれを1つの方法に入れました:

    private T Invoke<T>(Func<T> func)
    {
        try
        {
            return func.Invoke();
        }
        catch (Exception ex)
        {
            throw LogAndThrowFaultException(ex);
        }
    }

現在、ほとんどのメソッドは次のように呼び出します。

    public IEnumerable<PingResponse> GetAllForPingRequest(PingRequest pingRequest)
    {
        return Invoke(() => PingResponseLogic.GetAllForPingRequest(pingRequest));
    }

私の問題は、値を返す必要なくそれを呼び出すメソッドがいくつかあることです。

Invoke<void>(() => CustomVariableGroupLogic.Delete(customVariableGroup));

しかし、私はvoidそこを使用することはできません。このInvoke()メソッドは を受け取りますfuncが、この場合は である必要がありますactionInvoke()いくつかの調査を行ったところ、別のメソッドを作成する必要があるように見えますが、アクションを実行します。ただし、これらの提案は2009年と2010年のものです。Invoke()のような別のメソッドを作成しなくても、どうにかして func メソッドを使用することは可能Invoke2()ですか?

4

4 に答える 4

6

手っ取り早い解決策の 1 つは、メソッドを呼び出した後にデフォルトDelete値を追加することです。Invokeメソッドの結果を変数に代入しない場合、とにかく無視されます。たとえば、次のコードはこれを示しています。

Invoke(() => {CustomVariableGroupLogic.Delete(customVariableGroup); return 0; });

ここで提案された同様の例を見ることができます。

Funcそのような呼び出しが非常に多い場合は、指定されたを返す派手なラッパーを作成できますAction。例:

Func<Action, Func<int>> wrap = action => () => {action(); return 0;};

今、あなたはすることができます

Invoke(() => wrap(() => CustomVariableGroupLogic.Delete(customVariableGroup)));

しかし、これはラムダの狂気に少し近づいています

pcm2 にインスパイアされた:

Invoke単にパラメータとして受け取る へのオーバーロードを作成し、Action上で提案されたソリューションを使用して で実装を呼び出すことができFunc<T>ます。

public void Invoke(Action action)
{
    Invoke(() => {action(); return 0;});
}

今、あなたは簡単にできる

Invoke(() => CustomVariableGroupLogic.Delete(customVariableGroup));
于 2013-06-04T19:56:24.363 に答える
1
  1. あなたは本当にしなければなりませんfunc.Invoke()か?だけではないのはなぜfunc()ですか?
  2. なぜあなたのInvoke静的ではないのですか?
  3. 実行内容によってLogAndThrowFaultExceptionは、これはかなり悪い可能性があります。内部例外を常に に設定して、例外スタックが保持されるようにしexます。

しかし、はい、T の代わりに void を返す 2 つ目の関数が必要です。

于 2013-06-04T19:54:52.153 に答える