Это не особенно красиво / свободно, но если вы действительно хотите избежать передачи фиктивных значений параметров, вы можете использовать выражение, которое возвращает делегат.
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);
}