3

有没有办法将任何方法作为参数发送?我需要对所有类型的方法都这样做,而不是关心签名和返回。说这样的话(糟糕的代码,只是为了这个想法):

public class Foo
{
...
void TestMethod(DontKnowWhatToPutHere theDelegate) {}
...
}

...

foo.TestMethod(-foo.AnotherMethod(1,2)-);
foo.TestMethod(-foo.AnotherMethod("I don't care method signature nor returning type")-);

我尝试使用Actionas 参数进行操作,但没有成功。

我需要做的是将任何方法发送到函数,然后使用反射来获取方法名称和参数,所以如果你们有其他方法可以弄清楚,我也很乐意听到。

4

3 回答 3

9

不,编译器必须始终能够识别要转换为的特定委托,并且没有与所有方法签名兼容的单一委托类型。您可以通过使用Action,等,然后Action<T>,等来获得很长的路要走...但即使在涉及和参数时也会失败。此外,还需要考虑重载解决方案。Action<T1, T2>Func<TResult>Func<T1, TResult>outref

此外,您的语法正在传递方法调用的结果,这与首先传递方法不同。(这忽略了-前缀/后缀,这似乎是虚构的语法。)

可以使用Expression<Action>并包装方法调用:

void TestMethod(Expression<Action> action)
{
    ...
}

然后:

foo.TestMethod(() => foo.AnotherMethod(1,2));

然后,您可以在其中TestMethod查看表达式树以找出它是一个方法调用,计算出目标、参数等。有关更多信息,请参阅表达式树的 MSDN 页面。

于 2012-10-01T16:50:15.330 回答
4

您可以传递MethodInfo对象

void TestMethod(MethodInfo methodInfo, object methodObject, object[] parameters)
{
    methodInfo.Invoke(methodObject, parameters);
}
于 2012-10-01T16:51:36.143 回答
0
public class Foo
{
   void TestMethod(Action<int, int> theDelegate) {}
   void TestMethod(Action<string> theDelegate) {}
}

foo.TestMethod(() => foo.AnotherMethod(1,2));
foo.TestMethod(() => foo.AnotherMethod("I don't care method signature nor returning type"));
于 2012-10-01T16:51:52.680 回答