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

C#中从基Record转换为派生Record时如何避免生成多余属性?

解决C# Record派生类构造时避免多余属性的问题

要解决你遇到的问题,核心是避免让派生类的主构造函数参数自动生成额外属性,同时复用基类实例的字段值。以下是几种可行方案:

方案1:静态工厂方法封装字段复制逻辑

通过给派生类添加静态工厂方法,内部处理基类字段的提取,外部调用无需手动输入所有基类字段,且派生类不会生成多余属性:

public record BaseRecord(string FirstName, string LastName);

public record ChildRecord(string FirstName, string LastName, DateTime DateOfBirth) 
    : BaseRecord(FirstName, LastName)
{
    // 静态工厂方法,接收基类实例和新增字段
    public static ChildRecord FromBase(BaseRecord baseRecord, DateTime dateOfBirth)
    {
        return new ChildRecord(baseRecord.FirstName, baseRecord.LastName, dateOfBirth);
    }
}

调用方式:

var baseRecord = new BaseRecord("John", "Doe");
var childRecord = ChildRecord.FromBase(baseRecord, new DateTime(2000, 1, 1));

方案2:显式构造函数替代主构造函数语法糖

放弃主构造函数的自动属性生成,改用显式构造函数,将接收基类实例的构造函数作为入口,内部调用私有构造函数初始化所有字段:

public record BaseRecord(string FirstName, string LastName);

public record ChildRecord : BaseRecord
{
    // 公共构造函数,接收基类实例和新增字段
    public ChildRecord(BaseRecord baseRecord, DateTime dateOfBirth) 
        : this(baseRecord.FirstName, baseRecord.LastName, dateOfBirth)
    {
    }

    // 私有构造函数,负责初始化所有字段(不会生成公共属性)
    private ChildRecord(string firstName, string lastName, DateTime dateOfBirth) 
        : base(firstName, lastName)
    {
        DateOfBirth = dateOfBirth;
    }

    // 显式声明新增属性
    public DateTime DateOfBirth { get; init; }
}

调用方式和你原来的代码一致,但派生类不会有多余的baseRecord属性:

var baseRecord = new BaseRecord("John", "Doe");
var childRecord = new ChildRecord(baseRecord, new DateTime(2000, 1, 1));

方案3:解构基类实例简化调用

利用Record默认支持的解构功能,将基类实例的字段解构后传入派生类构造函数,避免手动逐个引用属性:

public record BaseRecord(string FirstName, string LastName);
public record ChildRecord(string FirstName, string LastName, DateTime DateOfBirth) 
    : BaseRecord(FirstName, LastName);

调用方式:

var baseRecord = new BaseRecord("John", "Doe");
// 解构基类实例到变量
var (firstName, lastName) = baseRecord;
var childRecord = new ChildRecord(firstName, lastName, new DateTime(2000, 1, 1));

这种方式保持了派生类的简洁性,只是调用时多了一步解构操作,无需额外编写方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:30:18