这是我的情况,我有一个包含许多方法并且有一个入口点的库。我没有访问库源代码。
图书馆有方法
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);
问题是我不想在A上调用方法我想在另一个实例上调用它。我有一个实例的全局列表,因为与库对话的对象数量同时限制为10。默认值:
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;
}
我知道我可以用Invoke做到这一点,但我喜欢这样的事实:我可以在编译时知道Methode1是否是A的成员并且是一个好的签名
CallSomethingInLibrary存在的原因是因为我不想复制过去的那些行。
if(DosomeValidation())
{
Semaphore1.Wait();
A available=GetAvailableInstance();
...
它也可以用作某种自定义的LazyInstantiation,它可以做更多的事情。
谢谢
答案 0 :(得分:1)
定义您的方法:
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));
答案 1 :(得分:0)
您的“我有一些看起来像的代码”无法编译。如果返回类型为new List<int>()
,则无法返回T
。您还必须在true
的{{1}}分支上返回一些内容。
因此,要使原始代码正常工作,您需要这样的东西:
if
然后你会这样称呼它:
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
此代码中没有任何内容阻止您从任何类型调用它 - 只要编译器可以将调用解析为A available = GetAvailableInstance();
List<int> resultOfLib = CallSomethingInLibrary(available.methode1, n => new List<int>(), 8);
。
您需要澄清“我想在不同的实例上调用它”的含义。