C# Expression表達式筆記


整理了一下表達式樹的一些東西,入門足夠了

先從ConstantExpression 開始一步一步的來吧  它表示具有常量值的表達式

我們選建一個控制台應用程序

ConstantExpression _constExp = Expression.Constant( "aaa" , typeof ( string )); //一個常量
//Console.Writeline("aaa");
MethodCallExpression _methodCallexp=Expression.Call( typeof (Console).GetMethod( "WriteLine" , new Type[]{ typeof ( string )}),_constExp);
Expression<Action> consoleLambdaExp = Expression.Lambda<Action>(_methodCallexp);
consoleLambdaExp.Compile()();
 
Console.ReadLine();

下邊的MethodCallExpression你也許不知道是什么回事,不要急我下邊會詳細講的,這相當於

Console.WriteLine("aaa");  輸出一個常量,看一下結果

如果想自己輸入一個值輸出呢,那就用ParameterExpression 它表示一個參數表達式,我們只要把上邊的代碼做一下小改動就行

ParameterExpression _parameExp = Expression.Parameter( typeof ( string ), "MyParameter" );
 
MethodCallExpression _methodCallexpP = Expression.Call( typeof (Console).GetMethod( "WriteLine" , new Type[] { typeof ( string ) }), _parameExp);
Expression<Action< string >> _consStringExp = Expression.Lambda<Action< string >>(_methodCallexpP, _parameExp);
_consStringExp.Compile()( "Hello!!" );

參數parameExp就是一個string類型的變量我們讓它輸出一個Hello!!

有點感覺了吧,慢慢來好玩的還在后邊,現在我們就說一下MethodCallExpression它可以調用靜態方法和實例方法,我們上邊的代碼就是調用 的靜態方法

,我先講一下調用靜態方法,再講調用實例方法。

我們建一個返回string的靜態方法,傳入一個object類型的值

public static string ConsStr( object str)
{
     string _str = str + "aa" ;
     Console.WriteLine(_str);
     return _str;
}

看一下我們是怎么調用自己的靜態方法的

ParameterExpression _paraObj = Expression.Parameter( typeof ( object ), "objPara" );
MethodCallExpression _MyStateMethod = Expression.Call( typeof (Program).GetMethod( "ConsStr" , new Type[] { typeof ( object ) }), _paraObj);
Expression<Func< object , string >> _meyLambdaState = Expression.Lambda<Func< object , string >>(_MyStateMethod, _paraObj);
string s_tr = _meyLambdaState.Compile()( "ni Hao" );
Console.WriteLine( "返回值: " + s_tr);

  new Type[] { typeof(object) } 就是我們的方法里的參數類型,后邊的paraObj是相當於參數值了,如果 是多參數就在 Type[],和后邊再加上相應 的類型和參數就行

靜態方法你有些了解了,下面講一下調用實例方法

我們寫一個非靜態方法

public string ConsStr2( object str)
{
     string _str = str + "aa" ;
     Console.WriteLine(_str);
     return _str;
}

調用的時候只要把上邊的代碼改動一點就ok Expression.Call為我們提供了我們想要的重載

Program _pg = new Program();
ParameterExpression _paraObj2 = Expression.Parameter( typeof ( object ), "objPara" );
MethodCallExpression _MyStateMethod2 = Expression.Call(Expression.Constant(_pg), typeof (Program).GetMethod( "ConsStr2" ), _paraObj2);
Expression<Func< object , string >> _meyLambdaState2 = Expression.Lambda<Func< object , string >>(_MyStateMethod2, _paraObj2);
string s_tr2 = _meyLambdaState.Compile()( "you shi ni " );
Console.WriteLine( "返回值: " + s_tr2);

   簡單吧。

再下來我們講什么呢,也許你猜到了UnaryExpression一元運算符表達式和 BinaryExpression  二元運算符表達式

我們先看一個這兩個表達式的簡單例子后,我們再做一個復雜的例子

UnaryExpression我們做一個5--的表達式

ConstantExpression _consNum = Expression.Constant(5, typeof ( int ));
UnaryExpression _unaryPlus = Expression.Decrement(_consNum);
Expression<Func< int >> _unaryLam = Expression.Lambda<Func< int >>(_unaryPlus);
Console.WriteLine(_unaryLam.Compile()());

BinaryExpression  我們做一個a+b的例子 

ParameterExpression _ParaA = Expression.Parameter( typeof ( int ), "a" );
ParameterExpression _ParaB = Expression.Parameter( typeof ( int ), "b" );
BinaryExpression _BinaAdd = Expression.Add(_ParaA, _ParaB);
Expression<Func< int , int , int >> _MyBinaryAddLamb = Expression.Lambda<Func< int , int , int >>(_BinaAdd, new ParameterExpression[] { _ParaA, _ParaB });
Console.WriteLine( "表達式:  " + _MyBinaryAddLamb);
Console.WriteLine(_MyBinaryAddLamb.Compile()(3, 6));

  不難吧,

我們做一把兩個表達式放一起做一個例子吧 (a+b)*(--c)

ParameterExpression _ParaA = Expression.Parameter( typeof ( int ), "a" );
ParameterExpression _ParaB = Expression.Parameter( typeof ( int ), "b" );
BinaryExpression _BinaAdd = Expression.Add(_ParaA, _ParaB);  //a+b
 
ParameterExpression _paraC = Expression.Parameter( typeof ( int ), "c" );
UnaryExpression _paraDecr = Expression.Decrement(_paraC);    //(a+b)*(--c)
BinaryExpression _binaMultiply = Expression.Multiply(_BinaAdd, _paraDecr);
Expression<Func< int , int , int , int >> _MyBinaryLamb = Expression.Lambda<Func< int , int , int , int >>(_binaMultiply, new ParameterExpression[] { _ParaA, _ParaB, _paraC });
Console.WriteLine( "表達式:  " + _MyBinaryLamb);
Console.WriteLine(_MyBinaryLamb.Compile()(3, 6, 5));

  

今天就講到這


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM