反射的一点儿东西

虽然会牺牲一点儿性能,有时候还是得用那么一下。

 public List<SIL.AARTO.BLL.Admin.LanguageLookupEntity> BindUCLanguageLookupByID(string editVTIntNo)
        {

//加载需要用到类所在的程序集

System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"bin\SIL.AARTO.BLL.dll"));            

//通过加载的程序集获取类的类型

System.Type type = assembly.GetType("SIL.AARTO.BLL.Admin.Class1"); 

//获取类的对象           

object theObj = assembly.CreateInstance("SIL.AARTO.BLL.Admin.Class1");

//获取参数类型列表

System.Type[] paramTypes = new System.Type[1];            

paramTypes[0] = System.Type.GetType("System.String");

//获取到类中需要调用的方法(BindingFlags.IgnoreCase一定要记得写)

System.Reflection.MethodInfo methodInfo = type.GetMethod("GetListBySourceTableID", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, CallingConventions.Any, paramTypes, null);

//参数赋值

Object[] parameters = new Object[1];            

parameters[0] = editVTIntNo;

 List<SIL.AARTO.BLL.Admin.LanguageLookupEntity> entityList = (List<SIL.AARTO.BLL.Admin.LanguageLookupEntity>)methodInfo.Invoke(theObj, parameters);

return entityList;

}

 

2.要调用的方法参数是一个实体对象,给实体对象的属性赋值,用InvokeMember()方法。

public void UpdateIntoLookup(int addVTIntNo, List<SIL.AARTO.BLL.Admin.LanguageLookupEntity> lgEntityList, string className, string fkidName, string DescrName)         {            

if (addVTIntNo > 0)             {                

System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"bin\SIL.AARTO.DAL.Services.dll"));                

System.Type serviceType = assembly.GetType("SIL.AARTO.DAL.Services." + className + "Service");                

object serviceObj = assembly.CreateInstance("SIL.AARTO.DAL.Services." + className + "Service");

 for (int i = 0; i < lgEntityList.Count; i++)                 {                    

System.Reflection.Assembly assemblyEntity = System.Reflection.Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"bin\SIL.AARTO.DAL.Entities.dll"));                    

System.Type entityType = assemblyEntity.GetType("SIL.AARTO.DAL.Entities." + className);                    

object entityObj = assemblyEntity.CreateInstance("SIL.AARTO.DAL.Entities." + className);

System.Type[] paramTypes = new System.Type[2];                    

paramTypes[0] = System.Type.GetType("System.Int32");                    

paramTypes[1] = System.Type.GetType("System.String");                    

System.Reflection.MethodInfo methodInfo = serviceType.GetMethod("GetBy" + fkidName + "LsCode", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, CallingConventions.Any, paramTypes, null);

 Object[] parameters = new Object[2];                    

parameters[0] = addVTIntNo;                    

parameters[1] = lgEntityList[i].LsCode;                    

object entityObjSelected = methodInfo.Invoke(serviceObj, parameters);

if (entityObjSelected == null)                     {                        

entityType.InvokeMember(fkidName, BindingFlags.SetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance,                                         null, entityObj, new object[] { addVTIntNo });                        

entityType.InvokeMember("LsCode", BindingFlags.SetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance,                                         null, entityObj, new object[] { lgEntityList[i].LsCode });                        

entityType.InvokeMember(DescrName, BindingFlags.SetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance,                                         null, entityObj, new object[] { lgEntityList[i].LookupValue });

                        Type[] typeList = new Type[] { entityType };                        

System.Reflection.MethodInfo methodInfoSave = serviceType.GetMethod("Save", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, CallingConventions.Any, typeList, null);                        

methodInfoSave.Invoke(serviceObj, new object[] { entityObj });                    

}                     else                     {                        

entityType.InvokeMember(fkidName, BindingFlags.SetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance,                                         null, entityObjSelected, new object[] { addVTIntNo });                        

entityType.InvokeMember("LsCode", BindingFlags.SetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance,                                         null, entityObjSelected, new object[] { lgEntityList[i].LsCode });                        

entityType.InvokeMember(DescrName, BindingFlags.SetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance,                                         null, entityObjSelected, new object[] { lgEntityList[i].LookupValue });

                        Type[] typeList = new Type[] { entityType };                        

System.Reflection.MethodInfo methodInfoSave = serviceType.GetMethod("Save", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, CallingConventions.Any, typeList, null);                        

methodInfoSave.Invoke(serviceObj, new object[] { entityObjSelected });

                    }                

}            

}        

}

转载于:https://www.cnblogs.com/lindasoft/archive/2012/05/03/2480306.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值