如何生成对方法参数的“表达式”引用
How to generate an `Expression` reference to a method parameter
如果我有一个使用 Expression
树构建代码的方法来处理运行时类型,我如何创建一个引用该方法参数的 Expression
?
例如在下面的代码中,我如何构建 Expression
s 来传递方法参数的引用?
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();
}
由于表达式编译为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);
}
如果我有一个使用 Expression
树构建代码的方法来处理运行时类型,我如何创建一个引用该方法参数的 Expression
?
例如在下面的代码中,我如何构建 Expression
s 来传递方法参数的引用?
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();
}
由于表达式编译为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);
}