【问题标题】:How can I make a Multiple property lambda expression with Linq如何使用 Linq 制作多属性 lambda 表达式
【发布时间】:2017-08-07 20:53:08
【问题描述】:

我用

ParameterExpression parameter = Expression.Parameter(typeof(T), "p");

var myexp=Expression.Lambda<Func<T, TKey>>(Expression.Property(parameter, "myid"), parameter);

像这样创建一个 lambda 表达式 myexp

p=>myid

现在我想创建一个这样的多属性

p=> new {myid,myid2}

【问题讨论】:

  • 您可以只编写您尝试创建的 lambda,并在调试器中查看它以查看它正在使用哪些表达式,以便您知道具体需要创建什么。
  • @Servy 我是为泛型类写的,需要处理 propertyName 来改变
  • @JohnTiXor 好的。这并没有改变我的观点。
  • 我想你的意思是p =&gt; p.myid

标签: c# .net linq


【解决方案1】:

这样做的棘手部分是访问匿名类型的类型,因此您可以调用new 来获取它。我通常使用 LINQPad 创建一个示例 lambda 并将其转储以查看格式:

Expression<Func<Test,object>> lambdax = p => new { p.myid, p.myid2 };
lambdax.Dump();

假设p的类型是Test

class Test {
    public int myid;
    public int myid2;
}

然后您可以创建Expressions 来重新创建lambdax 值:

var exampleTest = new Test();
var example = new { exampleTest.myid, exampleTest.myid2 };
var exampleType = example.GetType();

var rci = exampleType.GetConstructors()[0];
var parm = Expression.Parameter(typeof(Test), "p");
var args = new[] { Expression.PropertyOrField(parm, "myid"), Expression.PropertyOrField(parm, "myid2") };

var body = Expression.New(rci, args, exampleType.GetMembers().Where(m => m.MemberType == MemberTypes.Property));
var lambda = Expression.Lambda(body, parm);

【讨论】:

  • 我试过 LINQPad 并且喜欢它,非常感谢帮助 ^ ^,现在我使用对象类型传递匿名类型来做我想做的事!
猜你喜欢
  • 2020-06-18
  • 1970-01-01
  • 2016-04-18
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
相关资源
最近更新 更多