This is not particularly nice / free, but if you really want to avoid passing parameter values ββof a dummy type, you can use an expression that returns a delegate.
SetResolverMethod<ISomeInterface>(x => new Func<int, MyVarA>(x.GetNameById));
The implementation of SetResolverMethod will look something like this:
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); }
Edit: If you want to create Func<> as a set of overloads for each delegate, you can increase your level of ownership by including method parameter types in the general parameter types of your method.
p.SetResolverMethod<ISomeInterface, int, MyVarA>(x => x.GetNameById);
As you can see, the caller no longer needs to specify the type of delegate, thus saving about 8 characters.
I performed three overloads for parameters 0, 1, and 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); }
Nathan baulch
source share