Как сгенерировать ссылку `Expression` на параметр метода - PullRequest
2 голосов
/ 23 марта 2019

Если у меня есть метод, который строит код с использованием деревьев Expression, для обработки типов времени выполнения, как я могу создать Expression, который ссылается на параметр метода?

Например, в приведенном ниже кодеКак мне построить Expression с, чтобы передать в этой ссылке параметры метода?

public static bool ExpressionContains(string s, string sub) {
    var cmi = typeof(String).GetMethod("Contains", new[] { typeof(string) });
    var body = Expression.Call(cmi, s ???, sub ???);

    return Expression.Lambda<Func<bool>>(body).Compile().Invoke();
}

1 Ответ

3 голосов
/ 23 марта 2019

Поскольку выражение компилируется в Func<bool>, насколько это касается, значения s и sub являются константами:

public static bool ExpressionContains(string s, string sub) {
    var cmi = typeof(String).GetMethod("Contains", new[] { typeof(string) });
    var body = Expression.Call(
        Expression.Constant(s),
        cmi,
        Expression.Constant(sub));

    return Expression.Lambda<Func<bool>>(body).Compile().Invoke();
}

Если вы хотите скомпилировать Func<string, string, bool>, где были переданы s и sub, тогда:

public static bool ExpressionContains(string s, string sub) {
    var sExpr = Expression.Parameter(typeof(string), "s");
    var subExpr = Expression.Parameter(typeof(string), "sub");
    var cmi = typeof(String).GetMethod("Contains", new[] { typeof(string) });
    var body = Expression.Call(sExpr, cmi, subExpr);

    return Expression.Lambda<Func<string, string, bool>>(body, new[] { sExpr, subExpr }).Compile().Invoke(s, sub);
}
...