如何生成方法参数的`Expression`引用

问题描述 投票:2回答:1

如果我有一个使用Expression树构建代码的方法,为了处理运行时类型,我如何创建一个引用该方法参数的Expression

例如。在下面的代码中,如何构建Expressions以传入方法参数?

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();
}
c# reflection expression-trees
1个回答
3
投票

由于表达式编译为Func<bool>,就其而言,ssub的值是常数:

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>ssub,那么:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.