下面係今日試制的代碼:
public void Test()
{
var Param1 = Expression.Parameter(typeof(String), "a");
var Method1 = typeof(String).GetMethod("Trim", new Type[] { });
var CallMethod1 = Expression.Call(Param1, Method1);
Expression
Ex = Expression.Lambda
String Msg = " ABC ";
String Result = Ex.Compile().Invoke(Msg);
}
以上代碼會產生一句類似 a=>a.Trim() 的 LINQ Expression 再 Compile 成 Function
Msg = "
Result = "ABC";
var Param1.... 創建一個 LINQ Parameter "a"
var Method1.... 用 Reflection 去找找 String 的 Trim() Method.
var CallMethod1.... 創建 LINQ Expression 的 Body "a.Trim()"
Ex = Expression.Lambda..... 用 Parameter "a" 同 a.Trim() 建立 LINQ Expression "a=>a.Trim()"
最後 Ex.Compile() 就會成 Func
Invoke 一次就可以將 Msg 進行 Trim() 的動作.
這裡可以用 Func
當然我會更懶地用 Dynamic Language Runtime 進行以下動作.
dynamic MethodObj = new ExpandoObject();
MethodObj.CustomMethod1 = Ex.Compile();
String Result = MethodObj.CustomMethod1(Msg);
這樣就可以直接調用 MethodObj 的 CustomMethod1 就進行 Trim 的動作.
當然 Trim 又可需要這麼煩的動作. 這只是一個最簡單運用 Expression 進行生產代碼的方法.
沒有留言:
發佈留言