You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过泛型按类名获取类,实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:45:49