有没有办法发送 任何 方法作为参数?我需要为所有类型的方法做到这一点,而不是关心签名和返回。说出这样的话(糟糕的代码,仅仅是为了这个想法):
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")-);
我尝试使用Action
作为参数,但没有成功。
我需要做的是将 任何 方法发送到函数,然后使用反射来获取方法名称和参数,所以如果有其他方式你们可以搞清楚,我也很乐意听到它。
答案 0 :(得分:9)
没有。编译器必须始终能够识别要转换为的特定委托,并且没有与所有方法签名兼容的单个委托类型。您可以使用Action
,Action<T>
,Action<T1, T2>
等,然后Func<TResult>
,Func<T1, TResult>
等来获得很长的路要走......但即使这样做也会失败它涉及out
和ref
参数。此外,需要考虑重载决策。
此外,您的语法是传递方法调用的结果,这与首先传递方法不同。 (这忽略了-
前缀/后缀,它似乎是伪造的语法。)
您可以使用的是Expression<Action>
并包装方法调用:
void TestMethod(Expression<Action> action)
{
...
}
然后:
foo.TestMethod(() => foo.AnotherMethod(1,2));
在TestMethod
中,您可以查看表达式树,找出它是方法调用,计算目标,参数等。有关详细信息,请参阅MSDN page on expression trees。
答案 1 :(得分:4)
您可以传递MethodInfo对象
void TestMethod(MethodInfo methodInfo, object methodObject, object[] parameters)
{
methodInfo.Invoke(methodObject, parameters);
}
答案 2 :(得分: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"));