从表达式获取MethodInfo而不知道方法签名

时间:2013-05-21 14:42:59

标签: c# lambda expression

我正在尝试传递描述方法的表达式,但我希望参数是强类型的,我不想知道方法签名或传递表达式中的参数,如下所示:< / p>

GetMethod<MyClass>(c => c.DoSomething);

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))

但坦率地说,这非常难看。

这可能吗?

1 个答案:

答案 0 :(得分:4)

每个可能的Action / Func都有一个重载。它不会涵盖所有的可能性(你有一个额外的重载,你已经在那里覆盖所有边缘情况),但它将处理大部分。

每个action / func重载的主体都可以调用上面为实际实现而显示的重载。

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);
}

//...
然后可以像这样实现

GetMethodImpl

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

}

这可以只是对现有GetMethod实施的略微修改。 T2将成为您的代表;您可能需要将其强制转换为Delegate,具体取决于您的使用方式。