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
相关产品推荐
相关产品推荐

