表達式樹練習實踐:變量、常量與賦值


表達式樹練習實踐:變量、常量與賦值

定義變量

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”


免責聲明!

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



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