【发布时间】:2016-02-11 15:08:58
【问题描述】:
我希望能够动态构建一个表达式,它本质上是一个属性选择器。
我正在尝试使用它,以便提供灵活的搜索 UI,然后将选定的搜索参数转换为实体框架查询。
由于我正在使用另一个库,我拥有了我需要的大部分内容,但我缺少将我的查询字符串参数转换为其他库所需的适当表达式选择器的最后一部分。
库接受一个参数:
Expression<Func<TObject, TPropertyType>>
如果将其嵌入到应用程序中,将如何对其进行编码的示例如下:
Expression<Func<MyObject, int>> expression = x=> x.IntegerProperty;
但是,我需要能够动态生成这个表达式,因为重要的是我只知道对象的类型 (MyObject) 和作为字符串值的属性名称 ("IntegerProperty")。属性值显然会映射到对象上可以是任何非复杂类型的属性。
所以本质上我想我想找到一种方法来动态构建表达式,它指定要返回的正确对象属性以及返回值由该属性类型确定的位置。
伪代码:
string ObjectPropertyName
Type ObjectType
Type ObjectPropertyType = typeof(ObjectType).GetProperty(ObjectPropertyName).Property
Expression<Func<[ObjectType], [ObjectPropertyType]>> expression = x=> x.[ObjectPropertyName];
更新:
到此为止
ParameterExpression objectParameter = Expression.Parameter(type, "x");
MemberExpression objectProperty = Expression.Property(objectParameter, "PropertyNameString");
Expression<Func<ObjectType, int>> expression = Expression.Lambda<Func<ObjectType, int>>(objectProperty, objectParameter);
但我遇到的问题是返回类型并不总是 int,而可能是其他类型。
【问题讨论】:
-
您有
ObjectType作为Type还是泛型类型参数?您将如何调用库中正确版本的方法? -
你有 ExpressionBuilder 类来处理这些事情,但我认为可能有更简单的方法来解决你的问题。哪个库是“其他库”,你在什么类上调用什么方法?
-
我将 ObjectType 作为泛型类型参数
-
和
ObjectPropertyType? -
构建这样的表达式没有问题,但我不明白你将如何调用没有
TPropertyType的目标函数。请注意,Expression<Func<TObject, TPropertyType>>不能被视为Expression<TObject, object>>,反之亦然。您最好发布一个真实的示例,因为我们需要开发整个方法调用,而不仅仅是表达式。
标签: c# lambda expression-trees