反射的一点儿东西

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

 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 });

                    }                

}            

}        

}

posted @ 2012-05-03 11:14  sshh  阅读(219)  评论(0编辑  收藏  举报