整理了一下表達式樹的一些東西,入門足夠了
先從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));
|

今天就講到這
