如何通过泛型按类名获取类,实现DevExpress网格动态加载目录?
动态加载关联表数据到DevExpress网格(无if-else/switch实现)
需求背景
项目基于Entity Framework与Unit-of-Work模式,需将关联数据表动态加载到DevExpress网格的LookUpEdit仓储中,现有实现依赖if-else判断表名,需改为泛型动态实现以消除分支判断。
优化方案
1. 修正类型获取方法
原GetTypeByName方法返回类型错误,改为返回Type类型,用于后续反射调用:
private Type GetTypeByName(string typeName) { foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies().Reverse()) { var type = assembly.GetType(typeName); if (type != null && typeof(Entity).IsAssignableFrom(type)) { return type; } } return null; }
2. 封装反射调用泛型数据获取方法
新增方法通过反射调用泛版GetObjectList<T>,实现动态类型的数据获取:
private IEnumerable GetDynamicObjectList(Type entityType) { // 获取泛型方法GetObjectList<T> var method = typeof(YourClassName).GetMethod(nameof(GetObjectList), BindingFlags.NonPublic | BindingFlags.Instance); var genericMethod = method.MakeGenericMethod(entityType); // 调用方法并返回结果 return genericMethod.Invoke(this, null) as IEnumerable; }
注意:将YourClassName替换为当前类的实际名称
3. 重构主逻辑,消除if-else
修改原有加载逻辑,通过动态类型获取数据并绑定到LookUpEdit:
RepositoryItemLookUpEdit repositoryItemLookUpEdit = new RepositoryItemLookUpEdit() { ValueMember = repositoryItem.ValueMember, DisplayMember = repositoryItem.DisplayMember }; // 获取实体类型 var entityType = GetTypeByName(repositoryItem.FinalTable); if (entityType != null) { objectList = GetDynamicObjectList(entityType); } repositoryItemLookUpEdit.DataSource = objectList; bandedGridColumn.ColumnEdit = repositoryItemLookUpEdit;
4. 保留原有泛型数据获取方法(无需修改)
private IEnumerable<T> GetObjectList<T>() where T : Entity { IEnumerable<T> objectList = Enumerable.Empty<T>(); using (var unitOfWork = new UnitOfWork(new ApplicationDbContext(optionsBuilder.Options))) { objectList = unitOfWork.GetRepository<T>().GetAll(); } return objectList; }
说明
- 通过反射动态获取实体类型并调用泛型方法,彻底消除表名对应的分支判断
- 新增的
GetDynamicObjectList方法作为泛型方法的包装,实现动态类型适配 - 保留原有泛型方法的强类型特性,保证数据获取的可靠性
内容的提问来源于stack exchange,提问作者Aziz Nortozhiev
相关产品推荐
相关产品推荐

