在 ParameterExpression 类型 Dictionary<string,T> 中访问类型 T 属性

Accessing Type T property in the ParameterExpression type Dictionary<string,T>

我有用于数据过滤的表达式树代码,到目前为止它被用于通用列表 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));

此处 NameType T 中的 属性,结果 post Lambda 编译为 Func<T,bool>,我将其应用于 Where IEnumerable 类型的子句。现在底层系统已更改为在 Dictionary<string,T> 上使用相同的代码,因此集合中的所有类型 T 值现在都有一个关联的字符串键,类型 T 现在可以作为字典对象的值访问。此外,我正在应用 IQueryable,它采用表达式树,源代码的最终 lambda post 编译将是 Func<KeyValuePair<string,T>,bool>,因此无法在最终结果处理中应用值。

现修改代码如下:

var parameterType = Expression.Parameter(typeof(KeyValuePair<string,T>), "obj");

以下代码失败,因为现在名称 属性 在 KeyValuePair 的值中,我们不能将其用作类型 T:

var memberExpression = Expression.Property(parameterType, "Name");

任何使它工作的指示或任何让我朝着正确方向前进的建议?

您可以通过这种方式获得调用 ["name"] 项的表达式:

var nameProperty= Expression.Call(parameterType, 
       typeof(IDictionary<string, T>).GetMethod("get_Item"), 
       Expression.Constant("Name")); 

或如:

var nameProperty = Expression.Property(parameterType, "Item", 
                         new Expression[] { Expression.Constant("Name") });

两者都是Item属性

的调用

EDIT :要从 KeyValuePair 获取值,您必须获取 属性 密钥,将其与 "Name" 和 属性 值并将其与值进行比较:

var parameterType = Expression.Parameter(typeof(KeyValuePair<string,T>), "obj");

var value = Expression.Property(parameterType, "Value" );
var key = Expression.Property(parameterType, "Key");

var  eq1 = Expression.Equal(key, Expression.Constant("Name"));
var  eq2 = Expression.Equal(value, constantExpression);
var and = Expression.And(eq1, eq2);
var lambda = Expression.Lambda(and, parameterType);