它不是特别漂亮/流畅,但是如果您真的想避免传递伪参数值,那么您可以使用返回委托的表达式。
SetResolverMethod<ISomeInterface>(x => new Func<int, MyVarA>(x.GetNameById));
这个
SetResolverMethod
实现方式如下:
public void SetResolverMethod<T>(Expression<Func<T, Delegate>> expr)
{
var unary = (UnaryExpression) expr.Body;
var methodCall = (MethodCallExpression) unary.Operand;
var constant = (ConstantExpression) methodCall.Arguments[2];
var method = (MethodInfo) constant.Value;
Console.WriteLine(method.Name);
}
编辑:
如果您愿意为每个对象创建一组重载
Func<>
委托,可以通过将方法参数类型包含在方法的泛型参数类型中来提高流畅性。
p.SetResolverMethod<ISomeInterface, int, MyVarA>(x => x.GetNameById);
如您所见,调用者不再需要指定委托类型,因此节省了大约8个字符。
我已经为0、1和2参数实现了三个重载:
public void SetResolverMethod<T, TResult>(Expression<Func<T, Func<TResult>>> expr)
{
SetResolverMethod((LambdaExpression) expr);
}
public void SetResolverMethod<T, T1, TResult>(Expression<Func<T, Func<T1, TResult>>> expr)
{
SetResolverMethod((LambdaExpression) expr);
}
public void SetResolverMethod<T, T1, T2, TResult>(Expression<Func<T, Func<T1, T2, TResult>>> expr)
{
SetResolverMethod((LambdaExpression) expr);
}
private void SetResolverMethod(LambdaExpression expr)
{
var unary = (UnaryExpression) expr.Body;
var methodCall = (MethodCallExpression) unary.Operand;
var constant = (ConstantExpression) methodCall.Arguments[2];
var method = (MethodInfo) constant.Value;
Console.WriteLine(method.Name);
}