程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 反射的Emit實現

反射的Emit實現

編輯:C#入門知識

 

在日常開發中,我們頻繁用到反射,除了最“繁重”的原始反射方式(這裡不講解),以及 4.0的關鍵字dynamic,還有許多的方式(Emit以及Linq)。接下來的演示,我將著重對以下這個類進行操作。 public class User
    {
        public string Username { get; set; }
    }     這是一個普通到不能再普通的類。我們要做的工作就是將Username屬性進行賦值。在以往的反射,這個性能恐怕令人難以接受首先說第一種,不說,直接貼代碼,代碼中有詳細注釋。 \\代碼         delegate void SetValueDelegate(string u);
        static void Work3()
        {
            User u = new User();

            string methodName = "set_Username";                     // 獲取函數(命名約束)
            var method = u.GetType().GetMethod(methodName);         // 查找函數
            var type = method.GetParameters()[0].ParameterType;     // 返回第一個參數的數據類型

            var parameter = Expression.Parameter(type, "value");    // 創建一個表達式參數
            // 創建指定 實例、函數、參數 的調用函數
            var callExpression = Expression.Call(Expression.Constant(u), method, parameter);
            // 創建調用函數的表達式
            Expression<SetValueDelegate> lambdaExpression = Expression.Lambda<SetValueDelegate>(callExpression, parameter);
            SetValueDelegate dd = lambdaExpression.Compile();// 生成可執行函數的委托。

            Stopwatch watch = new Stopwatch();
            watch.Start();
            for (int i = 0
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved