将任何方法作为参数发送以获取元数据

时间:2012-10-01 16:48:10

标签: c# .net

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

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作为参数,但没有成功。

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

3 个答案:

答案 0 :(得分:9)

没有。编译器必须始终能够识别要转换为的特定委托,并且没有与所有方法签名兼容的单个委托类型。您可以使用ActionAction<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 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"));