当前位置: 首页 > 编程语言 > C#

ConvertContainstoExpressionTree分享

时间:2023-04-10 16:58:56 C#

ConvertContainstoExpressionTree相关:CreateaLambdaexpressionwith3conditions考虑以下代码:fromainmyTblwherea.Address.Contains(strToCheck)selectaHowdoI将其转换为表达式树并使用表达式编写上面的代码?主要问题是将a.Address.Contains(strToCheck)转换为表达式树。编辑1)Address是一个字符串字段,strToCheck是一个字符串谢谢a.Address.Contains(strToCheck)意味着调用string.Contains实例上的a.Address实例方法和strToCheck参数。构建相应表达式的最简单方法是使用以下Expression.Call重载:publicstaticMethodCallExpressionCall(Expressioninstance,stringmethodName,Type[]typeArguments,paramsExpression[]arguments)问题):varbody=Expression.Call(Expression.PropertyOrField(param,"Address"),//实例"Contains",//方法Type.EmptyTypes,//没有泛型类型参数Expression.Constant(strToCheck)//参数);您未指定myTbl的类型,因此我使用对象列表创建了一个简单的解决方案。使用系统;使用System.Linq;使用System.Linq.Expressions;使用System.Collections.Generic;namespaceTest{classProgram{staticvoidMain(string[]args){varaddresses=FilterByAddress("Address",newList{newPerson{Address="Address1"},newPerson{Address="AAAAAA"}});}publicstaticIEnumerableFilterByAddress(stringstrToCheck,Listlist){varlistParam=Expression.Parameter(typeof(IEnumerable),"list");表达式包含=a=>a.Address.Contains(strToCheck);varselect=typeof(Enumerable).GetMethods().Single(m=>m.Name.Equals("Where")&&m.GetParameters()[1].ParameterType.GetGenericArguments().Length==2);vargenericMethod=select.MakeGenericMethod(new[]{typeof(Person)});varcall=Expression.Call(null,genericMethod,newExpression[]{listParam,contains});varlambda=Expression.Lambda,IEnumerable>>(call,new[]{listParam});返回lambda.Compile().Invoke(list);}}公共类Person{酒馆lic字符串地址{get;放;如果你想使用谓词过滤器,你可以将Expresssion作为参数传递(一行)staticvoidMain(string[]args){varstrToCheck="Address";varlist=newList{newPerson{Address="Address1"},newPerson{Address="AAAAAA"}};varaddresses=FilterByAddress(list,p=>p.Address.Contains(strToCheck));}publicstaticIEnumerableFilterByAddress(Listlist,ExpressionpredicateEx){varlistParam=Expression.Parameter(typeof(IEnumerable),"list");varselect=typeof(Enumerable).GetMethods().Single(m=>m.Name.Equals("Where")&&m.GetParameters()[1].ParameterType.GetGenericArguments().Length==2);vargenericMethod=select.MakeGenericMethod(new[]{typeof(Person)});varcall=Expression.Call(null,genericMethod,newExpression[]{listParam,predicateEx});varlambda=Expression.Lambda,IEnumerable>>(call,new[]{listParam});返回lambda.Compile().Invoke(list);如果你有一个非常复杂的谓词(表达式树可以从单行lambda计算),你可以使用一个技巧从谓词Func构造一个表表达式树,如下:staticvoidMain(string[]args){varstrToCheck="Address";Funcpredicate=p=>{returnp.Address.Contains(strToCheck);};varlist=newList{newPerson{Address="Address1"},newPerson{Address="AAAAAA"}};varaddresses=FilterByAddress(list,predicate);}publicstaticIEnumerableFilterByAddress(Listlist,Funcpredicate){varlistParam=Expression.Parameter(typeof(IEnumerable),"list");表达式predicateEx=p=>predicate(p);varselect=typeof(Enumerable).GetMethods().Single(m=>m.Name.Equals("Where")&&m.GetParameters()[1].ParameterType.GetGenericArguments().Length==2);vargenericMethod=select.MakeGenericMethod(new[]{typeof(Person)});varcall=Expression.Call(null,genericMethod,newExpression[]{listParam,predicateEx});varlambda=Expression.Lambda,IEnumerable>>(call,new[]{listParam});返回lambda.Compile().Invoke(list);上面的过滤器列表是C#学习教程:conversion包含了表达式树分享的所有内容,如果对大家有用的话并且需要了解更多关于C#学习教程,希望大家多多注意—staticvoidMain(string[]args){varstrToCheck="Address";Funcpredicate=p=>{returnp.Address.Contains(strToCheck);};varlist=newList{newPerson{Address="Address1"},newPerson{Address="AAAAAA"}};varaddresses=FilterBy(list,predicate);}publicstaticIEnumerableFilterBy(Listlist,Funcpredicate){varlistParam=Expression.Parameter(typeof(IEnumerable),"list");表达式>predicateEx=p=>predicate(p);varselect=typeof(Enumerable).GetMethods().Single(m=>m.Name.Equals("Where")&&m.GetParameters()[1].ParameterType.GetGenericArguments().Length==2);vargenericMethod=select.MakeGenericMethod(new[]{typeof(T)});varcall=Expression.Call(null,genericMethod,newExpression[]{listParam,predicateEx});varlambda=Expression.Lambda,IEnumerable>>(call,new[]{listParam});返回lambda.Compile().Invoke(list);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: