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)
但坦率地说,这很丑陋。
这可能吗?
只需为每个可能的操作/功能提供一个重载即可。它不会覆盖所有可能性(有一个额外的重载,您已经在那里展示了覆盖所有边缘情况的能力),但它会处理其中的大多数情况。
每个操作/函数重载的主体可以只调用上面显示的实际实现的重载。
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,具体取决于您如何使用它。