C #, создать (метод?) Выражение и вызвать его - PullRequest
3 голосов
/ 24 августа 2009

Я действительно новичок в c # expression. У меня есть какой-то класс что-то подобное

class SimpleClass
{
    private string ReturnString(string InputString)
    {
        return "result is: "+InputString;
    }

    public string Return(Expression exp)
    {
        LambdaExpression lambda = Expression.Lambda(exp);
        return lambda.Compile();
    }
}

Теперь я хотел бы вызвать этот метод Return с каким-нибудь параметром (псевдо), например:

      SimpleClass sc = new SimpleClass();
      Expression expression = Expression.MethodCall(//how to create expression to call SimpleClass.ReturnString with some parameter?);
     string result = sc.Return(expression);
    Console.WriteLine(result);

Спасибо за помощь / ответ.

Мэтт

Ответы [ 2 ]

6 голосов
/ 24 августа 2009

Было бы лучше применить подпись exp как можно раньше - то есть как Expression<Func<string>>

public string Return(Expression<Func<string>> expression)
{
    return expression.Compile()();
}

либо:

SimpleClass sc = new SimpleClass();
string result = sc.Return(() => sc.ReturnString("hello world"));
Console.WriteLine(result);

или

SimpleClass sc = new SimpleClass();
Expression expression = Expression.Call(
    Expression.Constant(sc),           // target-object
    "ReturnString",                    // method-name
    null,                              // generic type-argments
    Expression.Constant("hello world") // method-arguments
);
var lambda = Expression.Lambda<Func<string>>(expression);
string result = sc.Return(lambda);
Console.WriteLine(result);

Конечно, использование делегата (Func<string>) может работать так же хорошо во многих сценариях.

3 голосов
/ 24 августа 2009

Если ваша цель - выучить выражения, это нормально. Но если ваша цель состоит в том, чтобы выполнить эту конкретную задачу, то делегат будет более подходящим способом решения этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...