我是表达式Tree的新手,我需要将下面的lambda转换为Expression Tree
Data.Where(s => s.Property.ToString().StartsWith("My Search Data"));
但是我已经做到了
Data.Where(s => s.Property.StartsWith("My Search Data");
现在我需要在使用StartsWith之前使用ToString方法。
以下是我的示例代码。
ParameterExpression e = Expression.Parameter(typeof(T), "e");
PropertyInfo propertyInfo = typeof(T).GetProperty(field);
MemberExpression m = Expression.MakeMemberAccess(e, propertyInfo);
ConstantExpression c = Expression.Constant(data, typeof(string));
MethodInfo mi = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) });
Expression call = Expression.Call(m, mi, c);
Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(call, e);
query = query.Where(lambda);
答案 0 :(得分:3)
考虑使用允许您通过名称访问成员的重载。这将使这更容易做到。
// Data.Where(s => s.Property.ToString().StartsWith("My Search Data"));
var property = "Property";
var filter = "My Search Data";
var param = Expression.Parameter(typeof(T));
var body = Expression.Call(
Expression.Call(
Expression.Property(param, property),
"ToString",
null
),
"StartsWith",
null,
Expression.Constant(filter)
);
var lambda = Expression.Lambda<Func<T, bool>>(body, param);
答案 1 :(得分:2)
ideea是你必须从System.Object获取“ToString”方法。因为它是一个虚方法,运行时可以在真实对象上调度调用。
注意:IData是具有名为“Property”的属性的任何数据。
#app/assets/javascripts/application.js
$(document).on("change", "#some_id", function(e) {
$.get("forms/update", {index: $(this).val(), value: $(this).attr('id').to_i});
});