C#中如何从同基类的已实例化B对象动态赋值给C实例
解决C#中派生类间基类属性批量赋值的问题
给你几个实用的方案,不用手动挨个赋值:
1. 用反射动态赋值
直接通过反射遍历基类A的公共属性,把b的值复制到c上,不需要依赖任何第三方库:
using System.Reflection; // 获取基类A的所有可读写公共实例属性 var baseProps = typeof(A).GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.CanRead && p.CanWrite); foreach (var prop in baseProps) { var value = prop.GetValue(b); prop.SetValue(c, value); }
这种方式灵活,不管A以后加多少属性都不用改代码,但性能比编译期确定的方法稍差,要是高频调用或者属性特别多,得权衡下。
2. 用AutoMapper做对象映射
如果项目里已经引入了AutoMapper,配置起来很简单,它会自动匹配同名同类型的属性:
// 初始化配置(一般全局只做一次) var mapperConfig = new MapperConfiguration(cfg => { cfg.CreateMap<B, C>(); }); var mapper = mapperConfig.CreateMapper(); // 直接映射,AutoMapper会自动复制A的属性,忽略B的wuz和C的yuh C c = mapper.Map<C>(b);
要是需要更精细的控制,比如不想覆盖c的yuh属性,可以加个忽略配置:
cfg.CreateMap<B, C>() .ForMember(dest => dest.yuh, opt => opt.Ignore());
3. 封装复用的赋值方法
嫌反射性能差、不想加第三方库?那就把基类属性的赋值逻辑封装成一个静态方法,以后复用就行:
public static class APropertyMapper { public static void CopyAProperties(A source, A target) { target.foo = source.foo; target.bar = source.bar; target.baz = source.baz; // 以后A加新属性,就在这里加一行赋值 } } // 使用的时候直接调用 APropertyMapper.CopyAProperties(b, c);
这种方式类型安全、性能最好,就是以后基类加属性得记得更新这个方法,适合属性变动不频繁的场景。
内容的提问来源于stack exchange,提问作者CutePoison
相关产品推荐
相关产品推荐

