表達式樹練習實踐:變數、常量與賦值 定義變數 用來創建變數、變數參數表達式。 在 C 中,變數分為以下幾種類型: 值類型(Value types) 引用類型(Reference types) 指針類型(Pointer types) 一般上,只用到值類型和引用類型,這裡不會說到指針類型。 C 的基本值 ...
表達式樹練習實踐:變數、常量與賦值
定義變數
ParameterExpression
用來創建變數、變數參數表達式。
在 C# 中,變數分為以下幾種類型:
- 值類型(Value types)
- 引用類型(Reference types)
- 指針類型(Pointer types)
一般上,只用到值類型和引用類型,這裡不會說到指針類型。
C#的基本值類型有:bool、byte、char、double、float、int、long等(C#中,數組屬於引用類型)。
表達式樹創建一個有兩種方式變數:
ParameterExpression varA = Expression.Variable(typeof(int), "x");
ParameterExpression varB = Expression.Parameter(typeof(int), "y");
區別:
Expression.Variable()
表示創建一個變數;
Expression.Parameter()
表示創建一個傳入參數;
至於使用區別,後面會有很多具體示例可以體會到。
相同點:生成的類型都是 ParameterExpression
。
實例:
int a;
ParameterExpression varA = Expression.Variable(typeof(int), "x");
static void Main(string[] args)
{
// 等同 Test()里的 int b
ParameterExpression varB = Expression.Parameter(typeof(int), "y");
Console.ReadKey();
}
public static void Test(int b)
{
Console.WriteLine(b);
}
引用類型亦是使用相同方法創建變數。
關於引用類型的示例方法,後面會使用到。
定義常量
使用 Expression.Constan()
定義一個常量。
示例:
ConstantExpression constant = Expression.Constant(100);
ConstantExpression constant1 = Expression.Constant(100, typeof(int));
建議使用兩個參數的重載方法,這樣瀏覽代碼是,能夠快速理解,便於查找修改。
賦值
Expression.Assign()
用於給表達式樹變數賦值。
常用定義如下
BinaryExpression Assign(Expression left, Expression right);
將右邊表達式的值,賦予左邊表達式。
為變數賦值:
ParameterExpression a = Expression.Variable(typeof(int), "x");
ConstantExpression constant = Expression.Constant(100, typeof(int));
BinaryExpression assign = Expression.Assign(a, constant);
註意重載方法類型
Console
的常用重載方法有
public static void WriteLine(object value);
public static void WriteLine(float value);
public static void WriteLine(string value);
在使用表達式樹時,註意要調用的重載方法,不能被正常代碼的隱式轉換誤導。
int a = 100;
Console.WriteLine(a);
ParameterExpression aa = Expression.Parameter(typeof(int), "a");
BinaryExpression aaa = Expression.Assign(aa, Expression.Constant(100, typeof(int)));
MethodCallExpression method = Expression.Call(null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), aa);
// 如果沒有學到過執行表達式樹,現在可以先忽略這裡
var call = Expression.Block(new ParameterExpression[] { aa }, aaa, method);
Expression<Action> lambda = Expression.Lambda<Action>(call);
lambda.Compile()();
前面輸出 變數 a ,系統會進行隱式的類型轉換。但是使用表達式樹調用方法,要對應類型才行,以便找到正確的重載方法。上面的表達式樹調用 Console.WriteLine()
會報如下錯誤:
System.ArgumentException:“Expression of type 'System.Int32' cannot be used for parameter of type 'System.String' of method 'Void WriteLine(System.String)'
Arg_ParamName_Name”