【发布时间】:2013-08-30 08:20:15
【问题描述】:
我正在尝试将过滤器应用于 WPF 中的 DataGrid,并且过滤器属性需要一个谓词
例如:
dataGrid1.Filter = p => p.A_Field_Table1.Contains(textBox.Text);
但我的数据网格被反射填充,所以我只知道运行时数据网格内的对象类型。
然后我创建了一个动态生成 Predicate
public static Predicate< T > GetPredicate< T >(string column, string valueP, T objSource, string table)
{
Type itemType = typeof(T);
ParameterExpression predParam = Expression.Parameter(itemType, "p");
Expression left = Expression.Property(predParam, itemType.GetProperty("A_" + column+ "_" + table));
var valueStr= Expression.Constant(valueP);
var typeOfStr = valueStr.Type;
var containsMethod = typeOfStr.GetMethod("Contains", new [] { typeof(string) });
var call = Expression.Call(left, containsMethod, valueStr);
Func< T, bool > function = (Func< T, bool >)Expression.Lambda(call, new[] { predParam }).Compile();
return new Predicate< T >(function);
}
然后在接口上调用这个函数:
var dataGridItem = dataGrid.Items[0];
dataGrid1.Filter = Class_X.GetPredicate(columnRefName,textBox.Text,dataGridItem,tableRefName);
但是通用方法抛出一个异常,指出类型 T 是“对象”类型,即使 objSource 是 Model.TableName 类型。
我读了一些教程说 T 在运行时无法解析,那么我应该使用“动态”而不是泛型类型。
我已经尝试过使用“动态”类型,但是在将 Lambda 表达式转换为 Func
有没有更简单的方法来过滤由反射填充的数据网格?
【问题讨论】:
标签: c# generics datagrid filter predicate