C# 反射,动态类,动态方法

1.动态类名,固定方法名,例如.调用不一样类下边的GetById()方法:cors

//项目须要引用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.动态类名,动态方法(和上边一种引用同样)spa

根据接收不一样的实体调用不一样的方法:code

//项目须要引用Miscorsoft.CSharp类库,不然会报错:找不到编译动态表达式所需的一个或者多个类型.
//引用这两个命名空间
using System.Dynamic;
using System.Reflection;

Assembly asmb_Service = typeof(CityScsbxxbServiceBase).Assembly;   //引用对应方法的dll
Assembly asmb_entity = typeof(CityScsbxxbBase).Assembly;        //引用实体的dllxml

Type type = asmb_entity.GetType(entityClassName, false);        //entityClassName为实体类的名称(命名空间+类名)
var obj1 = System.Activator.CreateInstance(type);对象

type = asmb_Service.GetType(ServiceClassName, false);          //ServiceClassName为对应方法的类的名称(命名空间+类名)blog

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 });
相关文章
相关标签/搜索