整理了一下表達式樹的一些東西,入門足夠了spa
先從ConstantExpression 開始一步一步的來吧 它表示具備常量值的表達式blog
咱們選建一個控制檯應用程序ip
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你也許不知道是什麼回事,不要急我下邊會詳細講的,這至關於rem
Console.WriteLine("aaa"); 輸出一個常量,看一下結果string
若是想本身輸入一個值輸出呢,那就用ParameterExpression 它表示一個參數表達式,咱們只要把上邊的代碼作一下小改動就行it
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!!io
有點感受了吧,慢慢來好玩的還在後邊,如今咱們就說一下MethodCallExpression它能夠調用靜態方法和實例方法,咱們上邊的代碼就是調用 的靜態方法console
,我先講一下調用靜態方法,再講調用實例方法。入門
咱們建一個返回string的靜態方法,傳入一個object類型的值class
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));
今天就講到這