MethodGroup作为通用参数

时间:2012-02-10 03:37:28

标签: c# reflection lambda

我正在尝试编写一个从给定输入返回methodinfo类的方法,以便创建该方法的通用版本...即

var m = myClass.GetType().GetMethod("SomeMethod").MakeGenericMethod(...blahblah..);

这样做很好,除了我有我的方法名称的字符串文字,所以如果在重新分解的过程中我碰巧重命名我使用的方法之一我直到运行才发现时间。

我想要做的是创建一个帮助方法,我可以将lamba传递给指定方法组,这样我就可以获得方法名称的编译时检查,更不用说intellisense等了...即< / p>

MethodInfo mi = myClass.GetMethodInfo( o => o.SomeMethod );
m = mi.MakeGenericMethod(..blah...);

但我无法弄清楚助手的方法签名......

public MethodInfo GetMethodInfo(Func<MyClass,XXXX> lambda){ //What is my XXXX ? }

1 个答案:

答案 0 :(得分:5)

你可以这样做,但我很难过为什么你需要指定委托类型。如果没有它,它不起作用,但由于下面适用于BarMethod,代理类型是什么似乎并不重要:

public static void Main(String[] args)
{
    Foo f = new Foo();
    Console.WriteLine(ForMethod(() => f.FooMethod()).Name);
    Console.WriteLine(ForMethod(() => f.Foo2Method<String>()).Name);
    Console.WriteLine(ForMethod(() => f.BarMethod("foo")).Name);
    Console.ReadKey();
}

public static MethodInfo ForMethod(Expression<Action> e)
{
    var mi = ((MethodCallExpression) e.Body).Method;
    if (mi.IsGenericMethod)
        mi = mi.GetGenericMethodDefinition();
    return mi;
}

class Foo
{
    public void FooMethod() { }
    public void Foo2Method<T>() { }
    public void BarMethod(String foo) { }
}