c#Lambda Expression - 从字符串中获取属性值

时间:2016-03-27 08:00:36

标签: c# linq lambda iqueryable

请考虑以下lambda表达式:

IQueryable<Product> query = query.Where(x => x.ProductName.Contains("P100"));

我需要转换上面的代码:

IQueryable<Product> query = query.Where(x => x.GetPropertyValue("ProductName").Contains("P100"));

这里我添加了一个虚拟方法GetPropertyValue("ProductName")来解释需求。 在上面的代码中,属性应该在运行时解析。换句话说,我需要从刺激值E.g "ProductName"

访问该属性

我该怎么做?

2 个答案:

答案 0 :(得分:5)

var parameterExp = Expression.Parameter(typeof(Product), "type");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var someValue = Expression.Constant(propertyValue, typeof(string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);

Expression<Func<Product, bool>> predicate = Expression.Lambda<Func<T, bool>>
             (containsMethodExp, parameterExp);


var query = query.Where(predicate);

答案 1 :(得分:0)

您可以使用此扩展方法:

public static T GetPropertyValue<T>(this Product product, string propName)
{
   return (T)typeof(Product).GetProperty(propName).GetValue(product, null);
}

然后:

IQueryable<Product> query = query.Where(x => x.GetPropertyValue<string>("ProductName").Contains("P100"));

请注意,这不适用于Entity Framework查询数据库,但由于您没有使用实体框架标记问题,我不假设您正在使用它