我正在尝试传递描述方法的表达式,但我希望参数是强类型的,我不想知道方法签名或传递表达式中的参数,如下所示:< / 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))
但坦率地说,这非常难看。
这可能吗?
答案 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
,具体取决于您的使用方式。