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

C#中是否存在类似Object spread的对象扩展语法?

在C#中实现复制对象并修改单个属性的方案

C#没有JavaScript那种直接的...扩展运算符来快速复制对象属性,但可以通过以下几种方式实现类似需求:

1. 使用C# 9.0+的记录类型with表达式

如果ListInvoiceSurchargesGridByInvoice是记录类型(定义为record class或record struct),可以直接用with表达式创建对象副本并修改指定属性:

invoiceSurcharges.Result = from surcharge in invoiceSurcharges.Result
                           select surcharge with
                           {
                               AssociatedInvoice = $"{surcharge.InvoiceSerial}-{surcharge.InvoiceYear}"
                           };

记录类型默认实现了值相等语义,with表达式会自动复制原有对象的所有属性,再覆盖你指定的属性值,无需手动逐个赋值。

2. 给普通类添加复制构造函数

如果是普通类(非记录类型),可以给类添加一个复制构造函数,先复制所有原有属性,再修改目标属性:
首先给ListInvoiceSurchargesGridByInvoice添加复制构造函数:

public class ListInvoiceSurchargesGridByInvoice
{
    // 类的原有属性
    public string InvoiceSerial { get; set; }
    public string InvoiceYear { get; set; }
    public string AssociatedInvoice { get; set; }
    // 其他属性...

    // 复制构造函数:复制传入对象的所有属性
    public ListInvoiceSurchargesGridByInvoice(ListInvoiceSurchargesGridByInvoice other)
    {
        InvoiceSerial = other.InvoiceSerial;
        InvoiceYear = other.InvoiceYear;
        AssociatedInvoice = other.AssociatedInvoice;
        // 依次复制剩余的所有属性
    }
}

然后在查询中使用:

invoiceSurcharges.Result = from surcharge in invoiceSurcharges.Result
                           select new ListInvoiceSurchargesGridByInvoice(surcharge)
                           {
                               AssociatedInvoice = $"{surcharge.InvoiceSerial}-{surcharge.InvoiceYear}"
                           };

3. 使用反射或第三方映射库

如果不想手动编写复制逻辑,可以用反射实现通用的属性复制,或者借助AutoMapper这类映射库简化操作:
以AutoMapper为例,先全局配置映射规则:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<ListInvoiceSurchargesGridByInvoice, ListInvoiceSurchargesGridByInvoice>()
       .ForMember(dest => dest.AssociatedInvoice, opt => opt.MapFrom(src => $"{src.InvoiceSerial}-{src.InvoiceYear}"));
});
var mapper = config.CreateMapper();

之后在查询中直接调用映射方法:

invoiceSurcharges.Result = from surcharge in invoiceSurcharges.Result
                           select mapper.Map<ListInvoiceSurchargesGridByInvoice>(surcharge);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:16:23