2012-02-10 70 views
0

我想写一个方法从给定的输入中返回一个methodinfo类,以创建该方法的通用版本......即,MethodGroup作为通用参数

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

这工作是所有好,但我有字符串字面我的方法的名字,因此,如果在重新分解的过程中,我碰巧重命名的方法之一,我用我不知道找出直到运行时间。

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

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

但我一直无法弄清楚辅助的方法签名......

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

是什么的签名你的'SomeMethod'是什么样子? – 2012-02-10 03:39:22

+0

实际上这就是@ M.Babcock的观点,他们可能并可能会有所不同,这就是为什么我想从方法组中解析,而不是特定的方法签名。 – 2012-02-10 03:44:25

+0

我不认为这是可能的,但我可能是错的。 'Func'希望知道要传递给lambda,如果你不知道那该怎么办? – 2012-02-10 03:50:08

回答

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) { } 
} 
+0

我也考虑过这个问题,但基于这个问题,这些方法很可能是通用方法,因此您需要检查该方法是否为通用方法,并编辑底层方法定义 – 2012-02-10 03:57:25

+0

以覆盖此可能性。对于它的价值,几乎肯定有更好的方法。 – 2012-02-10 04:00:36

+0

+1 - 我纠正了。干得好! – 2012-02-10 04:03:11