私の場合、私は多くのメソッドと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));
あなたは 'Methode1'と他のものを' static'にすることができますので、それらを使用するためのリファレンスは必要ありません。 –
あなたは質問を明確にし、編集さコードを修正することはできますか?今、あなたは(十分に公平)Methode1/methode1を混合し、一覧/INT型を返すしています。また、第二の例ではavailable.funcLib()の戻り値を無視します。それほど抽象的ではない(そしていくらか働く)例が役に立ちます。私はコードでいくつかの問題を解決し@BenjaminPodszun私はライブラリクラスA –
はコード – user3704628