天天看點

C# 反射,動态類,動态方法

1.動态類名,固定方法名,例如.調用不同類下邊的GetById()方法:

//項目需要引用Miscorsoft.CSharp類庫,否則會報錯:找不到編譯動态表達式所需的一個或者多個類型.
//引用這兩個命名空間
using System.Dynamic;
using System.Reflection;

Assembly asmb = typeof(CityScsbxxbServiceBase).Assembly;      //表示調用dll(前提是項目引用該dll) CityScsbxxbServiceBase表示該dll中随便一個類名
Type type = asmb.GetType(strClassName, false);         //strClassName 表示類的名稱,最好寫成完整形式例如:Bobole.Service.City.CityScsbxxbServiceBase
dynamic obj1 = System.Activator.CreateInstance(type);
object entity = obj1.GetById(primaryKey);            //GetById 表示類strClassName 裡邊的一個方法 ,primaryKey表示該方法的參數
///下邊是對象轉換成xml      
var ele = new XElement("table");
if (entity != null) 
{ 
  var props = entity.GetType().GetProperties(); 
  foreach (var item in props) { 
  ele.Add(new XElement(item.Name, item.GetValue(entity, null))); 
} }

      

2.動态類名,動态方法(和上邊一種引用一樣)

根據接收不同的實體調用不同的方法:

//項目需要引用Miscorsoft.CSharp類庫,否則會報錯:找不到編譯動态表達式所需的一個或者多個類型.
//引用這兩個命名空間
using System.Dynamic;
using System.Reflection;      

Assembly asmb_Service = typeof(CityScsbxxbServiceBase).Assembly;   //引用對應方法的dll

Assembly asmb_entity = typeof(CityScsbxxbBase).Assembly;        //引用實體的dll

Type type = asmb_entity.GetType(entityClassName, false);        //entityClassName為實體類的名稱(命名空間+類名)

var obj1 = System.Activator.CreateInstance(type);

type = asmb_Service.GetType(ServiceClassName, false);          //ServiceClassName為對應方法的類的名稱(命名空間+類名)

dynamic service = System.Activator.CreateInstance(type);
var method = type.GetMethod("Update", new Type[] { obj1.GetType() });   //Update為動态方法名稱
     if (method == null)
          throw new Exception("未找到更新方法");
var success = method.Invoke(service, new object[] { obj1 });


      

轉載于:https://www.cnblogs.com/-hao/p/10025326.html

c#