操作子类型集合的唯一DRY实现方式?是否有更优方案?
优化方案:利用泛型消除重复代码
你的问题核心是重复的子类转换方法,这正是泛型可以完美解决的场景!通过泛型方法统一处理所有继承自BaseClass的子类,完全可以消除TransformFoos、TransformBars这类冗余代码。
方案一:基于无参构造的泛型实现
如果你的所有子类都有无参构造函数,可以直接用泛型约束简化实现:
public ICollection<T> Transform<T>(ICollection<T> source, Guid newId) where T : BaseClass, new() { var result = new List<T>(); foreach (var item in source) { var newItem = new T(); // 仅复制基类成员,符合你的需求 newItem.Id = newId; newItem.Name = item.Name; newItem.Property = item.Property; result.Add(newItem); } return result; }
调用的时候直接指定泛型类型即可,完全不需要额外的子类专属方法:
ICollection<Foo> transformedFoos = Transform(fooCollection, myNewGuid); ICollection<Bar> transformedBars = Transform(barCollection, myNewGuid);
方案二:支持自定义构造的泛型实现
如果部分子类没有无参构造,或者需要更灵活的实例创建逻辑,可以保留工厂函数,但改成泛型版本的Func<T>,避免类型转换:
public ICollection<T> Transform<T>(ICollection<T> source, Guid newId, Func<T> factory) where T : BaseClass { var result = new List<T>(); foreach (var item in source) { var newItem = factory(); newItem.Id = newId; newItem.Name = item.Name; newItem.Property = item.Property; result.Add(newItem); } return result; }
调用示例:
// 假设Foo需要带参数的构造 ICollection<Foo> transformedFoos = Transform(fooCollection, myNewGuid, () => new Foo("someParam"));
为什么这比原来的实现更好?
- 消除重复代码:不用再为每个子类编写几乎完全相同的转换方法
- 强类型安全:避免了
BaseClass和子类之间的来回类型转换,减少潜在的类型错误 - 更简洁的调用:一行代码完成特定子类集合的转换,可读性更强
如果你的项目中后续需要更复杂的对象映射(比如复制子类专属属性),也可以考虑使用AutoMapper这类映射库,但对于当前仅复制基类成员的需求,泛型方法已经足够轻量和高效。
内容的提问来源于stack exchange,提问作者JAF
相关产品推荐
相关产品推荐

