2016-12-01 12 views
-1

私の場合、私は多くのメソッドと1つのエントリポイントを持つライブラリを持っています。私は図書館のソースコードへのアクセス権がありません。メソッドを呼び出すメソッドを呼び出すオブジェクトをC#で代理人として渡す

ライブラリはメソッド

Class A 
List<int> Methode1(int); 
List<int> Methode2(int); 
List<int> Methode3(int); 

を持って、私はそのように見えるいくつかのコードを持っている:

T CallSomethingInLibrary<T>(T defaultValue, Func<int, T>funcLib, int input) 
{ 
    if(defaultValue==null|| globalFlagDataSourceAsGchanged==true) 
    { 
    defaultValue=funcLib(input) 
    } 
    return defaultValue; 
} 

用途:

static A nameOfInstance = new A(); 
List<in> resultOfLib = CallSomethingInLibrary(defaultValue,nameOfInstance.Methode1,8); 

問題は、私が呼び出すにしたくないということですAI上のメソッドは別のインスタンスで呼び出す必要があります。ライブラリに話すオブジェクトの数が同時に10に制限されているため、私はインスタンスのグローバルリストを持っています。 defaultValue:

SemaphoreSlim Semaphore1 = new SemaphoreSlim(4); 

T CallSomethingInLibrary<T>(T defaultValue, Func<int, T>funcLib, int input) 
{ 
    if(defaultValue==null|| globalFlagDataSourceAsGchanged==true) 
    { 
    Semaphore1.Wait(); 
    A available=GetAvailableInstance(); 
    defaultValue=available.funcLib(input); 
    Semaphore1.Release(); 
    } 
    return defaultValue; 
} 

私は私が起動していることを行うことができます知っているが、私はMethode1が

Aの良い署名などの部材とCallSomethingInLibraryの理由である場合、私は、コンパイル時に知ることができるという事実が好き私はevrywhereの行をコピーしたくないからです。

if(DosomeValidation()) 
    { 
    Semaphore1.Wait(); 
    A available=GetAvailableInstance(); 
    ... 

これは、より多くのことを行うカスタムLazyInstantiationとしても使用されます。その後、

T CallSomethingInLibrary<T>(Func<A, T> funcLib) 
{ 
    if(DosomeValidation()) 
    { 
     A available=GetAvailableInstance(); 
     funcLib(available); 
     //Where is the return here?? 
    } 
    else 
    { 
     return new List<int>() 
    } 
} 

そしてそうのようにそれを呼び出す:

CallSomethingInLibrary(instance => instance.methode1(8)); 
+0

あなたは 'Methode1'と他のものを' static'にすることができますので、それらを使用するためのリファレンスは必要ありません。 –

+0

あなたは質問を明確にし、編集さコードを修正することはできますか?今、あなたは(十分に公平)Methode1/methode1を混合し、一覧/INT型を返すしています。また、第二の例ではavailable.funcLib()の戻り値を無視します。それほど抽象的ではない(そしていくらか働く)例が役に立ちます。私はコードでいくつかの問題を解決し@BenjaminPodszun私はライブラリクラスA –

+0

はコード – user3704628

答えて

1

はそうと、あなたの方法を定義しますありがとうコンパイル。返品タイプがTの場合、new List<int>()の返品はできません。また、iftrue支店で返却する必要があります。

T DoSomeValidation<T>(Func<int, T> funcLib, Func<int, T> funcDefault, int input) 
{ 
    if (DoSomeValidation()) 
    { 
     return funcLib(input); 
    } 
    else 
    { 
     return funcDefault(input); 
    } 
} 

は、その後、あなたがそうのようにそれを呼びたい:作品

A nameOfInstance = new A(); 
List<int> resultOfLib = CallSomethingInLibrary(nameOfInstance.methode1, n => new List<int>(), 8); 

だから、あなたの元のコードを動作させるために、あなたはこのようなものが必要。

それを超えると、あなたが求めているものと少し混乱します。 Aの別のインスタンスでこの関数を呼び出すことは自明です。コンパイラがダウンFunc<int, T>への呼び出しを解決できる限り、 - 任意の型からそれを呼び出すことができなく、このコードでは何もない

A available = GetAvailableInstance(); 
List<int> resultOfLib = CallSomethingInLibrary(available.methode1, n => new List<int>(), 8); 

:それはちょうどこのことでしょう。

「別のインスタンスで呼びたい」という意味を明確にする必要があります。

0

はあなたのない "私はのように見えるいくつかのコードを持っている"

+0

私は私の質問を明確にし、私はそのようなコードを必要とする理由の詳細を説明しました。ありがとうございました – user3704628

関連する問題