虽然会牺牲一点儿性能,有时候还是得用那么一下。
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 });
}
}
}
}