【发布时间】:2017-01-27 10:41:16
【问题描述】:
我有用于数据过滤的表达式树代码,直到它被用于通用列表 List<T> 并且以下代码可以正常工作:
var parameterType = Expression.Parameter(typeof(T), "obj");
var memberExpression = Expression.Property(parameterType, "Name");
很容易创建如下二进制表达式并处理结果:
var constantExpression = Expression.Constant("Jack",typeof(string));
var finalExpression = Expression.Equal(memberExpression,constantExpression);
var resultFunc = Expression.Lambda<Func<T, bool>>(finalExpression, parameterType).Compile();
// Final Result
sourceList.Where(obj => resultFunc(obj));
这里Name 是Type T 中的一个属性,因为Lambda 编译后的结果是Func<T,bool>,我曾经将其应用于Where 类型的Where 子句。现在底层系统已更改为在Dictionary<string,T> 上使用相同的代码,因此集合中的所有类型 T 值现在都具有关联的字符串键,并且类型 T 现在可以作为字典对象的值访问。另外我正在申请IQueryable,它采用表达式树,源端的最终lambda后编译将为Func<KeyValuePair<string,T>,bool>,因此无法在最终结果处理中应用该值。
以下是现在的代码修改:
var parameterType = Expression.Parameter(typeof(KeyValuePair<string,T>), "obj");
以下代码失败,因为现在 Name 属性位于 KeyValuePair 的 Value 中,我们不能将其用作 Type T:
var memberExpression = Expression.Property(parameterType, "Name");
有什么可以让它发挥作用的指针,或者有什么建议可以让我朝着正确的方向前进吗?
【问题讨论】:
标签: c# .net lambda expression-trees func