在C#/ VB.Net中动态传递函数作为参数

时间:2019-07-07 22:16:01

标签: c# .net vb.net

我知道有很多替代方法,我们可以通过参数传递Func并从body方法内部调用它。

我的问题在此方面有所扩展。我有一个带有ReaderWriterLock的DataTable,并且想集中进行锁定的位置。我的想法是要有一个接受lambda的方法,从那里我可以做这样的事情。

public void processLambda(some lambda/callback param) {
    readWriteLock.acquireWriteLock(-1);
    try {
        // execute method here, which may write to the datatable.
    } finally {
        readWriteLock.releaseWriteLock();
    }
}

我应该怎么做?我不知道该方法将具有哪种类型的参数。

2 个答案:

答案 0 :(得分:0)

您的方法有一个选项是接受一个Action(无参数),然后,如果有参数,则使用lambda插入它们。

public void processLambda(Action baseMethod) {
    readWriteLock.acquireWriteLock(-1);
    try {
        baseMethod.Invoke();
    } finally {
        readWriteLock.releaseWriteLock();
    }
}

public void Main()
{
   processLambda(parameterlessMethod);
   processLambda(() => methodWithParameters(param1, param2, ...)); 
}

答案 1 :(得分:0)

您可以使用Delegate类型,该类型可以引用任何委托。

 public void InvokeWriteMethod(Delegate method, params object[] args)
 {
     readWriteLock.AcquireWriterLock(-1);

     try
     {
         method.DynamicInvoke(args);
     }
     finally
     {
         readWriteLock.ReleaseWriterLock();
     }
 }

然后可以通过传递任何类型的委托以及该委托方法的object参数数组或零个或多个离散参数来调用它:

InvokeWriteMethod(SomeMethod);
InvokeWriteMethod(SomeOtherMethod, new object[] {val1, val2, val3});
InvokeWriteMethod(YetAnotherMethod, val4, val5, val6);