在 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));
此处 Name
是 Type 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);
我有用于数据过滤的表达式树代码,到目前为止它被用于通用列表 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
中的 属性,结果 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);