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

操作子类型集合的唯一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:56:10