假设我有以下LambdaExpression:
var itemParam = Expression.Parameter(typeof(Thing), "thing");
var someValue = "ABCXYZ123"; // value to compare
LambdaExpression lex = Expression.Lambda(
Expression.Equal(
Expression.Property(itemParam, "Id"), // I want ID to be a Body expression parameter
Expression.Constant(someValue)
), itemParm);
我希望Expression.property(…)工厂中的属性名称(第二个参数)是一个参数,我该怎么做?
我希望看到一个像这样的构造函数,但它并不存在:
Expresssion.Property(Expression instance, Expression propName)
有没有什么技巧可以将参数化的ConstantExpression转换为所需的字符串或MemberInfo?也许我做这件事的方式不对。
我的直觉是,因为这些表达式树在编译时会变成轻量级的IL,所以需要成员访问信息,因此,在构建表达式树时必须提供成员和属性的名称。
谢谢你的任何提示!!
EDIT:希望添加这将用作Enumerable.Where(…)扩展方法的参数,用于确定两个类/实体之间关系的匹配
表达式树表示IL结构,这些结构与您在C#/VB.NET程序中看到的结构大致相同。不能参数化该属性表达式的原因与不能"参数化"以下代码的原因相同:
var x = new MyClass {Id = 1, Name = "hello"};
var propName = "Id";
var xId = x.propName; // <-- This will not compile
如果您需要实现此功能,并且表达式树没有传递给IQueryable<T>
,那么您可以编写一个助手函数,获取一个对象和一个字符串,并返回该字符串标识的对象属性的值;则可以使用Expression.Call
将该辅助函数调用到正在构建的表达式树中。