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

如何用泛型对象统一处理Invoice与CreditNote两类相似模型

解决方案

要统一处理Invoice和CreditNote类,核心是让它们共享一个包含共同属性/行为的基础接口,这样就能用接口类型的变量接收不同实例,在分支外统一访问共同成员。

步骤1:定义非泛型基础接口

先创建一个包含两类共同属性的接口,替代你之前的泛型接口(泛型接口在这里无法实现统一类型接收的需求):

public interface IInvoiceCommon
{
    string RequestId { get; set; }
    string SendToCir { get; set; }
    // 如果两类有共同方法,也可以在此声明
}

步骤2:让两个类实现该接口

修改Invoice和CreditNote,实现上述接口:

public class Invoice : IInvoiceCommon
{
    public string RequestId { get; set; }
    public string SendToCir { get; set; }
    // Invoice特有属性
    public string InvoiceNumber { get; set; }
}

public class CreditNote : IInvoiceCommon
{
    public string RequestId { get; set; }
    public string SendToCir { get; set; }
    // CreditNote特有属性
    public string CreditCode { get; set; }
}

步骤3:统一实例化与访问

将model声明为接口类型,在分支内实例化具体类,分支外即可访问共同属性:

IInvoiceCommon model = null;
var targetTypeId = Convert.ToInt32(invoiceType);

if (targetTypeId == InvoiceTypeCodeEnumDto.Invoice.Id)
{
    model = new Invoice();
    model.RequestId = request.CorrelationId;
    model.SendToCir = "Auto";
    // 访问Invoice特有属性需强转(安全方式)
    if (model is Invoice invoice)
    {
        invoice.InvoiceNumber = "INV-2024-001";
    }
}
else if (targetTypeId == InvoiceTypeCodeEnumDto.CreditNote.Id)
{
    model = JsonConvert.DeserializeObject<CreditNote>(request.Content)!;
    model.RequestId = request.CorrelationId;
    model.SendToCir = "Auto";
    // 访问CreditNote特有属性同理
    if (model is CreditNote creditNote)
    {
        creditNote.CreditCode = "CN-2024-001";
    }
}

// 分支外统一访问共同属性
if (model != null)
{
    // 如果Name是两类的共同属性,需将其加入IInvoiceCommon接口
    // model.Name = "foo";
}

关键说明

  • 你之前的泛型接口IInvoice<T>无法实现统一类型接收,因为Invoice和CreditNote实现的是不同的泛型接口实例(比如IInvoice<InvoiceType>和IInvoice<CreditNoteType>),编译器会认为这是两种不同的类型。
  • 若需处理特有属性/方法,使用is关键字进行类型判断并转换,避免强制转换引发异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:01:04