2009-09-11 123 views
2

我想写入过滤控件,它们使用对象类型T和属性名称并返回Expression<Func<T, bool>>,它检查传递属性的值。我不想使用反射,因为我担心这样的表达式不能被EF使用。我不能使用委托,因为C#没有属性的委托。我能做什么?也许我应该使用不同的方法来编写这些控件?生成用于过滤任意属性的表达式<

下面是使用反射我的第一种方法:

public string FilteringField { get; set; } 
public Expression<Func<T, bool>> GetFilterExpression() 
{ 
    if (cmbValue.SelectedIndex == 1) 
    return (o => (bool)typeof(T).GetProperty(FilteringField).GetValue(o, null)); 
    if (cmbValue.SelectedIndex == 2) 
    return (o => !(bool)typeof(T).GetProperty(FilteringField).GetValue(o, null)); 
    return null; 
} 
+0

Can你请澄清你的问题?你能给个例子吗? – 2009-09-11 12:45:48

回答

3

反思是不是这里有问题;英孚甚至无法注意到其中的差异。顺便说一句,自从你提到EF以来,代表方法是一个非首选项。最终,它是这样的:

public static IQueryable<T> Where<T>(this IQueryable<T> query, 
    string propertyName, object value) 
{ 
    PropertyInfo prop = typeof(T).GetProperty(propertyName); 
    var param = Expression.Parameter(typeof(T), "x"); 
    var body = Expression.Equal(
     Expression.Property(param, prop), 
     Expression.Constant(value, prop.PropertyType) 
     ); 
    var predicate = Expression.Lambda<Func<T, bool>>(body, param); 
    return query.Where(predicate); 
} 

请注意,你可以把它与Expression.PropertyOrField(propertyName)容易;我在这里没有使用过的原因是,在创建常量时知道成员类型(prop.PropertyType)非常方便 - 否则您可能会遇到空值问题。

相关问题