Вы можете построить выражение, например, следующим образом:
private static Expression<Action<T>> ConstructMethodCallExpressionWithItIsAnyOnAllArguments<T>(string mehodName)
{
var methodInfo = typeof(T).GetMethod(mehodName);
var argumentExpression = Expression.Parameter(typeof(T));
var methodExpression = Expression.Call(
argumentExpression,
methodInfo,
methodInfo.GetParameters().Select(pi => Expression.Call(
typeof(It), "IsAny", new Type[] { pi.ParameterType }, new Expression[0])));
var result = Expression.Lambda<Action<T>>(
methodExpression,
argumentExpression);
return result; //E.g.: Expression<Action<IService>>(s => s.SomeMethod(It.IsAny<int>(), It.IsAny<int>())
}
Использование:
var service = new Mock<IService>();
string methodName = nameof(IService.SomeMethod);
service.Setup(ConstructMethodCallExpressionWithItIsAnyOnAllArguments<IService>(methodName))
.Callback<int, int>((x, y) => { ... });
А если необходимо выражение Func
:
private static Expression<Func<T, TResult>> ConstructMethodCallExpressionFunc<T, TResult>(string mehodName)
{
var methodInfo = typeof(T).GetMethod(mehodName);
var argumentExpression = Expression.Parameter(typeof(T));
var methodExpression = Expression.Call(
argumentExpression,
methodInfo,
methodInfo.GetParameters().Select(pi => Expression.Call(
typeof(It), "IsAny", new Type[] { pi.ParameterType }, new Expression[0])));
var result = Expression.Lambda<Func<T, TResult>>(
methodExpression,
argumentExpression);
return result; //E.g.: Expression<Func<IService, string>>(s => s.SomeMethod(It.IsAny<int>(), It.IsAny<int>())
}
При использовании:
var service = new Mock<IService>();
string methodName = nameof(IService.SomeMethod);
service.Setup(ConstructMethodCallExpressionFunc<IService, string>(methodName))
.Returns<int, int>((x, y) => (x.ToString() + y.ToString()));