首先在表达式树中使用 ToString 方法

本文关键字:ToString 方法 表达式 | 更新日期: 2023-09-27 18:31:06

我是表达式树的新手,我需要将下面的lambda转换为表达式树

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);

首先在表达式树中使用 ToString 方法

请考虑改用允许您按名称访问成员的重载。 这将使这更容易做到。

// 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);

意思是你必须从System.Object获取"ToString"方法。因为它是一个虚拟方法,所以运行时可以在你的真实对象上调度调用。

注意:IData 是具有名为"属性"的属性的任何数据。

ParameterExpression e = Expression.Parameter(typeof(IData), "e");
PropertyInfo propertyInfo = typeof(IData).GetProperty("Property");
MemberExpression m = Expression.MakeMemberAccess(e, propertyInfo);
var toString = typeof (Object).GetMethod("ToString");
ConstantExpression c = Expression.Constant(data, typeof(string));
MethodInfo mi = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) });
var toStringValue = Expression.Call(m, toString);
Expression call = Expression.Call(toStringValue, mi, c);
Expression<Func<IData, bool>> lambda = Expression.Lambda<Func<IData, bool>>(call, e);