MethodGroup作为通用参数

Tim*_*vis 0 c# reflection lambda

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

var m = myClass.GetType().GetMethod("SomeMethod").MakeGenericMethod(...blahblah..);
Run Code Online (Sandbox Code Playgroud)

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

我想要做的是创建一个帮助方法,我可以传递lamba到指定方法组,这样我将得到方法名称的编译时间检查,更不用说智能感知等...即.

MethodInfo mi = myClass.GetMethodInfo( o => o.SomeMethod );
m = mi.MakeGenericMethod(..blah...);
Run Code Online (Sandbox Code Playgroud)

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

public MethodInfo GetMethodInfo(Func<MyClass,XXXX> lambda){ //What is my XXXX ? }
Run Code Online (Sandbox Code Playgroud)

Chr*_*ain 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) { }
}
Run Code Online (Sandbox Code Playgroud)