C#反射表达Linq

C#反射表达Linq,第1张

概述我在使用C#动态生成的lambda表达式时遇到了一些问题. 考虑以下情况: public class Person { public long Id { get; set; } public string Name { get; set; }}List<Person> persons = new List<Person> () { new Person { Id = 我在使用C#动态生成的lambda表达式时遇到了一些问题.

考虑以下情况:

public class Person {    public long ID { get; set; }    public string name { get; set; }}List<Person> persons = new List<Person> () {    new Person { ID = 1,name = "Foo" },new Person { ID = 2,name = "bar" },new Person { ID = 3,name = "Baz" },new Person { ID = 4,name = null },};

现在,做以下代码

ParameterExpression param = Expression.Parameter(typeof(Person),"arg");Expression prop = Expression.Property(param,"name");Expression value = Expression.Constant("bar");Type type = prop.Type;MethodInfo tolower = typeof(String).getmethod("Tolower",Type.EmptyTypes);Expression expLower = Expression.Call(prop,tolower);Expression clausule = Expression.Call(expLower,type.getmethod("Contains",new[] { type }),value);Expression notNull = Expression.NotEqual(prop,Expression.Constant(null));clausule = Expression.And(notNull,clausule);var exp = Expression.Lambda<Func<T,bool>>(clausule,param);

上面的代码生成以下exp.

//arg => ((arg.name != null) And (arg.name.Tolower().Contains("bar")))

现在,尝试将其应用到我的列表中.

下面的过滤器有效

var filteredListThatWorks = persons.Where(arg => arg.name != null && arg.name.Tolower().Contains("bar")).ToList();

下面的一个抛出Null对象的异常(因为ID 4名称)

var filteredListThatGivesExp = persons.Where(exp.Compile()).ToList();

当由lambda生成时,相同的表达式会在手动输入时抛出exp.
有谁知道解决这个问题的方法?

BR,

解决方法 并且是&amp ;;你想使用AndAlso(&&):

clausule = Expression.AndAlso(notNull,clausule);

如果有疑问,sharplab.io是一个很好的工具;如果我使用:

Expression<Func<Person,bool>> filter        = arg => arg.name != null && arg.name.Tolower().Contains("bar");

它告诉我它编译成相当于:

// ...BinaryExpression body = Expression.AndAlso(left,Expression.Call(instance,method,obj));// ...

(请注意,它必须对某些指令撒谎,因为它编译为无法在原始C#中实际表达的内容)

see it in action

总结

以上是内存溢出为你收集整理的C#反射表达Linq全部内容,希望文章能够帮你解决C#反射表达Linq所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1215087.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存