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)
你可以这样做,但我很难过为什么你需要指定委托类型.没有它它不起作用,但由于下面的工作原理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)