Moq подходит к этому, требуя, чтобы параметры метода были заглушены специальными объектами-маркерами, такими как:
test.Setup(m => m.SomeMethod(It.IsAny<int>()));
Кстати, это позволяет Moq разрешать перегрузки методов (одно имя метода неоднозначно, если выне имею никакого представления о требуемых параметрах.) Они идут немного дальше и используют его для фактического сопоставления параметров на основе критериев с целью имитации объектов для модульного тестирования.Исходный код доступен и может дать вам несколько идей.Они делают всякие забавные трюки с деревьями выражений.
Вот пример, основанный на источнике Moq (немного взломан, но показывает, как метод может быть извлечен из выражения):
internal static void ExtractMethod<T>(Expression<Action<T>> expression)
where T : class
{
var methodCall = expression.ToMethodCall();
var method = methodCall.Method;
var args = methodCall.Arguments.ToArray();
}
Прямо из источника Moq:
/// <summary>
/// Casts the body of the lambda expression to a <see cref="MethodCallExpression"/>.
/// </summary>
/// <exception cref="ArgumentException">If the body is not a method call.</exception>
public static MethodCallExpression ToMethodCall(this LambdaExpression expression)
{
Guard.NotNull(() => expression, expression);
var methodCall = expression.Body as MethodCallExpression;
if (methodCall == null)
{
throw new ArgumentException(string.Format(
CultureInfo.CurrentCulture,
Resources.SetupNotMethod,
expression.ToStringFixed()));
}
return methodCall;
}
Это будет работать с вашим кодом, но вам нужно будет передать «фиктивные» параметры, чтобы компилятор мог создать выражение.Так что если бы у вас было:
public void SomeMethod(int value, string text) {}
Тогда вы бы передали это как:
ExtractMethod(s => s.SomeMethod(0, null));