C# MethodGroup作为泛型参数

C# MethodGroup作为泛型参数,c#,reflection,lambda,C#,Reflection,Lambda,我试图编写一个方法,从给定的输入返回methodinfo类,以期创建该方法的通用版本…即 var m = myClass.GetType().GetMethod("SomeMethod").MakeGenericMethod(...blahblah..); 这是可行的,而且一切都很好,除了我有我的方法名的字符串文字,所以如果在重新分解的过程中,我碰巧重命名了我正在使用的其中一个方法,我直到运行时才发现 我想做的是创建一个helper方法,我可以将lamba传递给它来指定methodgroup,

我试图编写一个方法,从给定的输入返回methodinfo类,以期创建该方法的通用版本…即

var m = myClass.GetType().GetMethod("SomeMethod").MakeGenericMethod(...blahblah..);
这是可行的,而且一切都很好,除了我有我的方法名的字符串文字,所以如果在重新分解的过程中,我碰巧重命名了我正在使用的其中一个方法,我直到运行时才发现

我想做的是创建一个helper方法,我可以将lamba传递给它来指定methodgroup,这样我就可以在编译时检查方法名,更不用说intellisense等等了

MethodInfo mi = myClass.GetMethodInfo( o => o.SomeMethod );
m = mi.MakeGenericMethod(..blah...);
但是我还没有弄清楚助手的方法签名

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

您可以这样做,但我不明白为什么需要指定委托类型。如果没有这一点,它就不起作用,但由于以下内容适用于
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) { }
}
publicstaticvoidmain(字符串[]args)
{
Foo f=新的Foo();
Console.WriteLine(ForMethod(()=>f.foothod()).Name);
Console.WriteLine(ForMethod(()=>f.Foo2Method()).Name);
Console.WriteLine(ForMethod(()=>f.BarMethod(“foo”)).Name);
Console.ReadKey();
}
公共静态MethodInfo FormMethod(表达式e)
{
var mi=((MethodCallExpression)e.Body.Method;
if(mi.IsGenericMethod)
mi=mi.GetGenericMethodDefinition();
返回mi;
}
福班
{
public void foodmethod(){}
public void Foo2Method(){}
公共void方法(字符串foo){}
}

您可以这样做,但我不明白为什么需要指定委托类型。如果没有这一点,它就不起作用,但由于以下内容适用于
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) { }
}
publicstaticvoidmain(字符串[]args)
{
Foo f=新的Foo();
Console.WriteLine(ForMethod(()=>f.foothod()).Name);
Console.WriteLine(ForMethod(()=>f.Foo2Method()).Name);
Console.WriteLine(ForMethod(()=>f.BarMethod(“foo”)).Name);
Console.ReadKey();
}
公共静态MethodInfo FormMethod(表达式e)
{
var mi=((MethodCallExpression)e.Body.Method;
if(mi.IsGenericMethod)
mi=mi.GetGenericMethodDefinition();
返回mi;
}
福班
{
public void foodmethod(){}
public void Foo2Method(){}
公共void方法(字符串foo){}
}


你的
SomeMethod
的签名是什么样子的?事实上这就是问题所在@M.Babcock他们可能会不同,这就是为什么我想从方法组中解析,而不是从特定的方法签名。我认为这是不可能的,但我可能是错的
Func
希望知道传递给lambda的是什么,如果你不知道怎么传递?如果没有重载爆炸,你真的没有那么简单的方法,坚持使用字符串。这些方法可能不会经常改变,而且你可能没有太多(或者至少你不应该)。还有,为什么不从反射调用转移到动态调用?你的
SomeMethod
的签名是什么样子的?实际上这就是问题所在@M.Babcock它们可能会不同,也可能会不同,这就是为什么我想从方法组中解析,而不是从特定的方法签名中解析。我认为这是不可能的,但我可能是错的
Func
希望知道传递给lambda的是什么,如果你不知道怎么传递?如果没有重载爆炸,你真的没有那么简单的方法,坚持使用字符串。这些方法可能不会经常改变,而且你可能没有太多(或者至少你不应该)。另外,为什么不从反射调用转移到动态调用呢?我也考虑过这一点,但基于这个问题,这些方法很可能是泛型方法,因此您需要检查该方法是否是泛型方法,并对底层方法定义进行编辑以涵盖这种可能性。值得一提的是,几乎可以肯定有一种更好的方法。我将委托类型(操作)推到FormMethod定义中,使其更容易接受。仍然很困惑这是怎么回事。哦,我明白了。问题中的
操作
是通过调用委托来执行的“调用”,就像我在lambda中所做的那样-例如,
()=>f.BarMethod(“foo”)
是一个
表达式
,带有
主体
,其值是调用实际方法的
方法调用表达式。当然,
操作
从未实际调用过。它只是用来以编译时检查的方式将方法传递给
ForMethod
。哦,我认为这根本不值得。有趣的练习,但我认为有更好的方法来解决根本问题。我也考虑过这一点,但基于这个问题,这些方法很可能是泛型方法,因此您需要检查该方法是否是泛型方法,并对基础方法定义进行编辑以涵盖这种可能性。值得一提的是,几乎可以肯定有一种更好的方法。我将委托类型(操作)推到FormMethod定义中,使其更容易接受。仍然很困惑这是怎么回事。哦,我明白了。问题中的
操作
是通过调用委托来执行的“调用”,就像我在lambda中所做的那样-例如,
()=>f.BarMethod(“foo”)
是一个
表达式
,带有
主体
,其值是调用实际方法的
方法调用表达式。当然,
操作
从未实际调用过。它只是用来以编译时检查的方式将方法传递给
ForMethod
。哦,我认为这根本不值得。有趣的练习,但我认为有更好的方法来解决根本问题。