Введено неверное количество аргументов для вызова метода C # - PullRequest
0 голосов
/ 25 января 2019

У меня есть метод, который принимает 2 параметра. Я хочу построить метод во время выполнения, который будет вызывать этот метод и передавать один параметр по умолчанию. В новой функции будет передан другой параметр.

Я пытался создать лямбда-выражение, которое вызывает этот метод, но у меня есть ошибка: неверное количество аргументов для вызова метода.

static class Program
{
    static void Main(string[] args)
    {
        var method = typeof(Program).GetMethod("Method");
        // here i want to set first parameter as "parameter1" when new method will be called
        var lambda = Expression.Lambda<Func<string, string>>(Expression.Call(method, Expression.Constant("parameter1")));
        var adapter = lambda.Compile();
        // and here i wanna pass only one agrument - second (parameter2)
        var result = adapter("parameter2");

        // expected result "parameter1 ---- parameter2"
    }

    public static string Method(string parameter1, string parameter2)
    {
        return $"{parameter1} ---- {parameter2}";
    }

Я хочу передать только второй параметр при вызове функции. Сначала должно быть указано автоматически.

1 Ответ

0 голосов
/ 25 января 2019

Вы определили константу, но вам также нужно определить другой параметр, чтобы вы могли присвоить ей Method:

var method = typeof(Program).GetMethod("Method");
// here i want to set first parameter as "parameter1" when new method will be called

var param = Expression.Parameter(typeof(string));
var call = Expression.Call(method, Expression.Constant("parameter1"), param);
var lambda = Expression.Lambda<Func<string, string>>(call, param);
var adapter = lambda.Compile();
// and here i wanna pass only one agrument - second (parameter2)
var result = adapter("parameter2");

Конечно, я собираюсь предположить, что вы реально используете-дело для этого динамически.В противном случае вы могли бы просто написать:

Func<string, string> adapter = p => Method("parameter1", p);
...