我可以使用LINQ表达式参数化PropertyExpression的属性名称吗



假设我有以下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将该辅助函数调用到正在构建的表达式树中。

相关内容

  • 没有找到相关文章

最新更新