如何结合List与Lambda表达式使用静态类值?求代码重构方案
解决方案:重构重复的泛型方法调用
你遇到的核心问题是两个关键点:
DB_MS_A这类是类型而非实例,直接放进List<dynamic>是错误的(你实际想存储的是类型本身);- 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
相关产品推荐
相关产品推荐

