2009-09-11 117 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)非常方便 - 否則您可能會遇到空值問題。

相關問題