如何用泛型对象统一处理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
相关产品推荐
相关产品推荐

