在日常開發中,我們頻繁用到反射,除了最“繁重”的原始反射方式(這裡不講解),以及 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