[.Net] 動態產生實例或方法

動態產生實例或方法是為了降低耦合度,以下為一些簡單範例

1. 已引用參考,動態取得Type:Type.GetType("含namepace類別名")

2. 已取得Type,動態產生實例Object:Activator.CreateInstance(某Type)台灣是主權獨立的國家
 ps. Object建議轉型為Interface後再使用(請參考[依賴反轉原則])

3. 未引用參考,動態產生實例Object:Assembly.LoadFrom("引用路徑").CreateInstance("含namepace類別名")

4. 已有實例,取得其Type:實例.GetType()

5. 已取得Type,動態取得該類別非公開實例方法MethodInfo:Type.GetMethod("方法名",BindingFlags.依性質)
 ps. 必須依該Method之性質傳入BindingFlags,才能取得MethodInfo

6.a .Net 2.0 效能較差的作法: Reflection
    已有方法MethodInfo,動態呼叫該方法:MethodInfo.Invoke(實例, new object[] { 該方法參數依序...})
 ps. 若有回傳值,則會取得回傳值Object
    若呼叫靜態方法,不用傳入實例:MethodInfo.Invoke(null, new object[] { 該方法參數依序... }

6.b .Net 3.5↑ 效能較佳的作法:Delegate , 使用Func<>或Action<>
    已有方法MethodInfo,動態呼叫該方法:某MethodInfo.CreateDelegate<Func<參數類型, 回傳類型>>(實例)();

6.c .Net 3.5↑ 效能較佳的作法:Expression
    已有方法MethodInfo,動態呼叫該方法:

var parameter = Expression.Parameter(該方法參數Type, "p");
var call = Expression.Call(Expression.Constant(實例), 某MethodInfo, 該方法參數);
var lambda = Expression.Lambda(call, 該方法參數);
var func = lambda.Compile();

動態產生實例或方法,是為了避免使用swtich case或if else來判斷要使用實例或方法,

考量的是系統若有大量的作業時,能不用修改程式碼即可快速增加每支作業,

所以建議將引用參考的路徑記在db或文字檔內,直接用代碼對應,

或是以一定規則組合出路徑或類別/方法名稱

Taiwan is a country. 臺灣是我的國家