2012-06-18 5 views
5

サードパーティのライブラリに複数のメソッド呼び出しがあります。 これらのメソッドには、さまざまな異なるシグネチャ/パラメータの組み合わせがあります。1つのハンドラで複数のメソッド呼び出し(それぞれ異なるシグネチャを持つ)をラップします。

サードパーティ製のライブラリが生成した特定のエラーがあります。このエラーは、同じ解決方法が1つのハンドラ内で発生したいので、捕捉して処理したいものです。

私は、基本的に関数(デリゲート)とその引数をパラメータとして取り込み、いくつかのtry/catchロジック内で呼び出すメソッドを用意したいと考えています。

私は文法が正しいかどうかわかりませんが、構文が正しいとは思えませんが、渡される各メソッドのシグネチャが異なるという事実をどのように処理するのか分かりません。

提案がありますか?

答えて

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)); 
+0

感謝。 WrappedObjectはどこから来たのですか?これは第三者クラスのインスタンスですか? 私はサードパーティのクラスが静的クラスであるという点で少し複雑ですが、静的でないクラスを作成してそのメソッドを公開することができます。 – bkr

+0

@bkrこれは、あなたの "ラッパー"がオブジェクトのインスタンスをラップしていることを前提としていました。それがなければ、実際には簡単です - 私は編集して表示します –

+0

@bkr代わりに静的を使って表示するように編集しました。 –

関連する問題