更改正在调用方法的对象在C#中作为委托传递

时间:2016-12-01 23:08:43

标签: c# dynamic delegates

这是我的情况,我有一个包含许多方法并且有一个入口点的库。我没有访问库源代码。

图书馆有方法

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,它可以做更多的事情。

谢谢

2 个答案:

答案 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);

您需要澄清“我想在不同的实例上调用它”的含义。

相关问题