5

サードパーティライブラリのメソッドを複数回呼び出しています。これらのメソッドには、さまざまな異なるシグニチャ/パラメータの組み合わせがあります。

サードパーティのライブラリが生成する特定のエラーがあり、それをキャッチして処理したいと思います。解像度は同じなので、単一のハンドラーで実行したいと思います。

したがって、基本的に関数(デリゲート)とその引数をパラメーターとして取り込んで、try/catchロジック内で呼び出すメソッドを作成できるようにしたいと思います。

それが不可能なのか、構文が正しくないのかはわかりませんが、渡される各メソッドの署名が異なるという事実を処理する方法がわかりません。

助言がありますか?

4

1 に答える 1

7

とを使用ActionFunc<T>てメソッドをラップし、クロージャを使用して引数を渡すことができます。

public TResult CallMethod<TResult>(Func<ThirdPartyClass, TResult> func)
{
    try
    {
        return func(this.wrappedObject);
    }
    catch(ThirdPartyException e)
    {
        // Handle
    }
}

public void CallMethod(Action<ThirdPartyClass> method)
{
    this.CallMethod(() => { method(this.WrappedObject); return 0; });
}

次に、これを次の方法で使用できます。

var result = wrapper.CallMethod(thirdParty => thirdParty.Foo(bar, baz));

編集:上記は、サードパーティライブラリのインスタンスをラップしていることを前提としています。(コメントから)これらが静的メソッドであるとすると、次のように使用できます。

public static TResult CallMethod<TResult>(Func<TResult> func)
{
    try
    {
        return func();
    }
    catch(ThirdPartyException e)
    {
        // Handle
    }
}

public static void CallMethod(Action method)
{
    CallMethod(() => { method(); return 0; });
}

そして、次の方法で電話します。

var result = Wrapper.CallMethod(() => ThirdParty.Foo(bar, baz));
于 2012-06-18T17:28:12.640 に答える