博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解析入口参数为实体的表达式树
阅读量:6336 次
发布时间:2019-06-22

本文共 1989 字,大约阅读时间需要 6 分钟。

   在学习LINQ的时候碰到了解析表达式树的问题,书上的例子中入口参数为一个单一变量,这个在MSDN中给出了示例代码:

MSDN官方示例: 

//
 Add the following using directive to your code file:
//
 using System.Linq.Expressions;
//
 Create an expression tree.
Expression
<
Func
<
int
bool
>>
 exprTree 
=
 num 
=>
 num 
<
5
;
//
 Decompose the expression tree.
ParameterExpression param 
=
 (ParameterExpression)exprTree.Parameters[
0
];
BinaryExpression operation 
=
 (BinaryExpression)exprTree.Body;
ParameterExpression left 
=
 (ParameterExpression)operation.Left;
ConstantExpression right 
=
 (ConstantExpression)operation.Right;
Console.WriteLine(
"
Decomposed expression: {0} => {1} {2} {3}
"
,
param.Name, left.Name, operation.NodeType, right.Value);
//
 This code produces the following output:
//
 Decomposed expression: num => num LessThan 5

       这里表达式的入口参数是一个int型的变量,表达式左边就是这个参数本身,右边是一个常量,因此用

              ParameterExpression left = (ParameterExpression)operation.Left;

              ConstantExpression right = (ConstantExpression)operation.Right;

来解析即可,但如果入口是一个实体呢,这种情况很常见,应该怎么解析呢,通过向高人请教,最后用编译表达式树终于解决了这个问题:

 

    
//
实体类
    
public
 
class
 T
    {
        
public
 
int
 ID { 
get
set
; }
        
public
 
string
 Name { 
get
set
; }
    }
    
//
解析表达式树类
    
public
 
class
 Test
    {
        
public
 
void
 ExpressionTest(Expression
<
Func
<
T, 
bool
>>
 exprTree)
        {
            ParameterExpression param 
=
 (ParameterExpression)exprTree.Parameters[
0
];
            BinaryExpression operation 
=
 (BinaryExpression)exprTree.Body;
            MemberExpression left 
=
 (MemberExpression)operation.Left;
            MemberExpression right 
=
 (MemberExpression)operation.Right;
            var result
=
Expression.Lambda(right).Compile().DynamicInvoke();
            Console.WriteLine(
"
Decomposed expression:{0}=>{1} {2} {3}
"
,
                param.Name,left.Member.Name,operation.NodeType,result.ToString());
        }
    }
    
//
调用
    
public
 
class
 Program
    {
        
static
 
void
 Main(
string
[] args)
        {
            Test test 
=
 
new
 Test();
            T t 
=
 
new
 T() { ID 
=
 
1
, Name 
=
 
"
abc
"
 };
            test.ExpressionTest(o 
=>
 o.ID 
==
 t.ID);
            test.ExpressionTest(o 
=>
 o.Name 
==
 t.Name);            
            Console.Read();
        }
    }

 运行结果如下:

 

 

      园子中有位朋友提供了另外一种方法(),不过那个方法有一定缺陷,要依赖于实体类型,如果像上面代码中那样把表达式做为一个参数就无能为力了。

本文转自博客园博客,原文链接:,如需转载请自行联系原作者

你可能感兴趣的文章
Android Picasso
查看>>
top命令
查看>>
javascript的作用域
查看>>
新形势下初创B2B行业网站如何经营
查看>>
初心大陆-----python宝典 第五章之列表
查看>>
java基础学习2
查看>>
sysbench使用笔记
查看>>
有关电子商务信息的介绍
查看>>
NFC·(近距离无线通讯技术)
查看>>
多线程基础(三)NSThread基础
查看>>
PHP的学习--Traits新特性
查看>>
ubuntu下,py2,py3共存,/usr/bin/python: No module named virtualenvwrapper错误解决方法
查看>>
Ext.form.field.Number numberfield
查看>>
Linux文件夹分析
查看>>
解决部分月份绩效无法显示的问题:timestamp\union al\autocommit等的用法
查看>>
nginx 域名跳转 Nginx跳转自动到带www域名规则配置、nginx多域名向主域名跳转
查看>>
man openstack >>1.txt
查看>>
linux几大服务器版本大比拼
查看>>
在BT5系统中安装postgresQL
查看>>
【Magedu】Week01
查看>>