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

如何结合List与Lambda表达式使用静态类值?求代码重构方案

解决方案:重构重复的泛型方法调用

你遇到的核心问题是两个关键点:

  1. DB_MS_A这类是类型而非实例,直接放进List<dynamic>是错误的(你实际想存储的是类型本身);
  2. C#的泛型参数是编译时确定的,无法用变量(比如Lambda里的db)作为泛型参数传入。

下面给你几种可行的重构方案,按易用性和可读性排序:

方案1:封装成Action列表(最直观,无反射)

把每个类型的两次调用封装成一个Action,然后遍历执行——既避免重复代码,又不需要反射,可读性拉满:

public void Main()
{
    var actions = new List<Action>
    {
        () => { Execute01<DB_MS_A>(); Execute02<DB_MS_A>(); },
        () => { Execute01<DB_MS_B>(); Execute02<DB_MS_B>(); },
        () => { Execute01<DB_MS_C>(); Execute02<DB_MS_C>(); }
    };
    
    foreach (var action in actions)
    {
        action.Invoke();
    }
}

后续要新增DbModel类型时,只需要在列表里添加一行对应的Action即可,维护成本极低。

方案2:用反射调用泛型方法(适合类型数量多的场景)

如果你的DbModel类型特别多,不想逐个编写Action,可以用反射动态调用泛型方法:

public void Main()
{
    var dbTypes = new List<Type> { typeof(DB_MS_A), typeof(DB_MS_B), typeof(DB_MS_C) };
    
    foreach (var type in dbTypes)
    {
        // 获取Execute01的泛型方法定义,构造对应类型的具体方法
        var execute01Method = typeof(Sample).GetMethod(nameof(Execute01)).MakeGenericMethod(type);
        execute01Method.Invoke(this, null);
        
        var execute02Method = typeof(Sample).GetMethod(nameof(Execute02)).MakeGenericMethod(type);
        execute02Method.Invoke(this, null);
    }
}

⚠️ 注意:反射会带来少量性能开销,如果是高频调用的代码,建议优先选方案1;但如果类型数量极多,反射方案的维护成本会更低。

方案3:添加非泛型入口方法(封装反射逻辑)

如果Execute01和Execute02的逻辑可以基于IDatabaseModel的非泛型成员实现,你可以给这两个方法添加非泛型重载,把反射逻辑封装在方法内部:

// 新增非泛型重载
public void Execute01(Type dbModelType)
{
    if (!typeof(IDatabaseModel).IsAssignableFrom(dbModelType))
        throw new ArgumentException("类型必须实现IDatabaseModel接口");
    
    // 内部调用泛型版本
    typeof(Sample).GetMethod(nameof(Execute01)).MakeGenericMethod(dbModelType).Invoke(this, null);
}

public void Execute02(Type dbModelType)
{
    // 同理实现
}

// 简化后的Main方法
public void Main()
{
    var dbTypes = new List<Type> { typeof(DB_MS_A), typeof(DB_MS_B), typeof(DB_MS_C) };
    dbTypes.ForEach(type => { Execute01(type); Execute02(type); });
}

这个方案让Main方法更加简洁,把反射的复杂度隐藏在方法内部,对外只暴露清晰的调用入口。


内容的提问来源于stack exchange,提问作者ha2pa1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:28:23