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

C#如何将基类实例值复制到派生类(无需新增构造等方法)

解决方案

方案1:通用反射复制(无需修改原有类)

编写静态工具类,通过反射遍历基类公共属性,实现通用的基类到派生类属性复制,适配所有继承关系的类对。

public static class ObjectCopier
{
    public static void CopyBasePropertiesToDerived<TDerived, TBase>(TDerived derivedObj, TBase baseObj)
        where TDerived : TBase
        where TBase : class
    {
        if (derivedObj == null || baseObj == null)
            throw new ArgumentNullException(nameof(baseObj), "源或目标实例不能为null");

        // 获取基类的所有公共实例属性
        var baseProps = typeof(TBase).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        
        foreach (var prop in baseProps)
        {
            if (prop.CanWrite)
            {
                var value = prop.GetValue(baseObj);
                prop.SetValue(derivedObj, value);
            }
        }
    }
}

使用方式:

ItemsInformationWithWarehouses TowarIMagazyn = new ItemsInformationWithWarehouses();
ItemsInformation i = GetItemsInformationInstance(); // 假设已初始化

ObjectCopier.CopyBasePropertiesToDerived(TowarIMagazyn, i);

优缺点:

  • 优点:通用型强,一次编写可复用在所有基类派生类场景;完全不修改原有类结构。
  • 缺点:反射存在轻微性能损耗,高频调用场景可考虑缓存属性信息优化。

方案2:AutoMapper(第三方库,简洁高效)

如果项目已引入AutoMapper,这是最简洁的实现方式,配置一次后即可快速完成映射。

首先安装AutoMapper NuGet包,然后配置映射关系:

var mapperConfig = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<ItemsInformation, ItemsInformationWithWarehouses>();
});
IMapper mapper = mapperConfig.CreateMapper();

使用方式:

// 方式1:直接从基类实例创建派生类实例
ItemsInformationWithWarehouses TowarIMagazyn = mapper.Map<ItemsInformationWithWarehouses>(i);

// 方式2:复制到已存在的派生类实例
mapper.Map(i, TowarIMagazyn);

优缺点:

  • 优点:代码简洁,AutoMapper内部缓存映射逻辑,性能优于原生反射;支持复杂类型映射,扩展性强。
  • 缺点:需引入第三方依赖,若项目未使用过会增加额外开销。

方案3:手动扩展方法(性能最优)

将现有逐个赋值的逻辑封装到扩展方法中,既保持最优性能,又实现便捷调用,且无需修改原有类。

public static class ItemsInformationExtensions
{
    public static void CopyFrom(this ItemsInformationWithWarehouses derived, ItemsInformation baseObj)
    {
        if (derived == null || baseObj == null)
            throw new ArgumentNullException(nameof(baseObj), "源或目标实例不能为null");

        derived.magid1 = baseObj.magid1;
        derived.magid2 = baseObj.magid2;
        derived.dokmsid1 = baseObj.dokmsid1;
        derived.dokmsid2 = baseObj.dokmsid2;
        derived.Dostawa = baseObj.Dostawa;
        derived.Symbol = baseObj.Symbol;
        derived.Towar = baseObj.Towar;
        derived.Partia = baseObj.Partia;
        derived.PartiaE = baseObj.PartiaE;
        derived.SSCC = baseObj.SSCC;
        derived.PartiaO = baseObj.PartiaO;
        derived.Pozostalo = baseObj.Pozostalo;
        derived.JM = baseObj.JM;
        derived.sWc1 = baseObj.sWc1;
        derived.sWc2 = baseObj.sWc2;
        derived.sWc3 = baseObj.sWc3;
        derived.sWc4 = baseObj.sWc4;
        derived.sWc5 = baseObj.sWc5;
        derived.DataWstawienia = baseObj.DataWstawienia;
        derived.WyprodukowanoDla = baseObj.WyprodukowanoDla;
        derived.IndeksOdbiorcy = baseObj.IndeksOdbiorcy;
        derived.IndeksDostawcy = baseObj.IndeksDostawcy;
    }
}

使用方式:

TowarIMagazyn.CopyFrom(i);

优缺点:

  • 优点:性能最优,无反射或第三方库开销;逻辑直观,调试方便。
  • 缺点:仅适用于当前类对,基类属性变更时需同步修改扩展方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:50:39