在不知道方法签名的情况下从表达式获取 MethodInfo

bfl*_*mi3 0 c# lambda expression

我试图传递一个描述方法的表达式,但我希望参数是强类型的,并且我不想知道方法签名或传递表达式中的参数,如下所示:

GetMethod<MyClass>(c => c.DoSomething);
Run Code Online (Sandbox Code Playgroud)

哪里DoSomething可以有这样的方法签名......string DoSomething(int id, int count)

我知道我可以做这样的事情:

MemberInfo GetMethod<T>(Expression<Func<T, Delegate>> expression);

//implementation
GetMethod<MyClass>(c => new Func<int, int, string>(c.DoSomething))
Run Code Online (Sandbox Code Playgroud)

但坦率地说,这很丑陋。

这可能吗?

Ser*_*rvy 5

只需为每个可能的操作/功能提供一个重载即可。它不会覆盖所有可能性(有一个额外的重载,您已经在那里展示了覆盖所有边缘情况的能力),但它会处理其中的大多数情况。

每个操作/函数重载的主体可以只调用上面显示的实际实现的重载。

public MemberInfo GetMethod<T1, T2>(Expression<Func<T1, Func<T2>>> expression)
{
    return GetMethodImpl(expression);
}

public MemberInfo GetMethod<T1, T2, T3>(Expression<Func<T1, Func<T2, T3>>> expression)
{
    return GetMethodImpl(expression);
}

public MemberInfo GetMethod<T1, T2>(Expression<Func<T1, Action<T2>>> expression)
{
    return GetMethodImpl(expression);
}

//...
Run Code Online (Sandbox Code Playgroud)

GetMethodImpl然后可以像这样实现:

private MemberInfo GetMethodImpl<T1, T2>(Expression<Func<T1, T2>> expression)
{

}
Run Code Online (Sandbox Code Playgroud)

这只需对您现有的GetMethod实现进行轻微修改即可。 T2将成为您的代表;您可能需要将其转换为Delegate,具体取决于您如何使用它。