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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:50:22