【问题标题】:generic constraint to restrict collection to have same type of derived objects将集合限制为具有相同类型的派生对象的通用约束
【发布时间】:2017-03-17 09:17:09
【问题描述】:

我想限制 Collection 只具有使用泛型的相同类型的类。

public class InvoiceLine<T> where T : TransactionLine ,new() 
{

    private readonly IList<TransactionLine> _transactionLines = new List<TransactionLine>();
    public virtual IReadOnlyCollection<TransactionLine> TransactionLines => new ReadOnlyCollection<TransactionLine>(_transactionLines);

    public virtual void AddTransactionLine(TransactionLine transactionLine)
    {
        transactionLine.ThrowIfNull(nameof(transactionLine), "can't be null");
        _transactionLines.Add(transactionLine);
    }

    protected TransactionLine()
    {
        //doing some validation related stuff here.
    }

}

public abstract class TransactionLine : BaseEntity, IPeopleSoftCostCode, ICustomerAccountNumber
{
    public virtual InvoiceLine<TransactionLine> InvoiceLine { get; set; }
}

public class PermTransactionLine : TransactionLine
{

    public Perm Perm { get; set; }
}

 public class TempTransactionLine : TransactionLine
{
    public Temp Temp { get; set; }
}

我希望 InvoiceLine.TransactionLines 包含相同类型的 TransactionLines 而不是 PermTransactionLineTempTransactionLine 一起 在同一时间。 TransactionLine 必须是抽象的 - 不想直接创建对象。

我正在尝试添加 new() 约束但不起作用它说:

TransactionLine 必须有公共的无参数构造函数。

然后我使用 InvoiceLine 将其添加到发票中 - 最初我将所有类型的交易行放在一起作为计费运行的一部分,然后我将为特定交易类型创建发票。

任何想法,我怎么能做到这一点?

【问题讨论】:

  • 你打算在哪里使用T?如果您想将泛型变量限制为仅接受 TransactionLine 类型,我看不到使用泛型变量的意义
  • 然后我使用 InvoiceLine 将其添加到发票中 - 最初我将所有类型的交易行放在一起作为计费运行的一部分,然后我将为特定交易类型创建发票。

标签: c# generics generic-constraints


【解决方案1】:

你可以定义

public class PermInvoiceLine : InvoiceLine<PermTransactionLine> { }
public class TempInvoiceLine : InvoiceLine<TempTransactionLine> { }

并为每个XXXTransactionLine 使用适当的XXXInvoiceLine

在这种特殊情况下定义T : new() 约束是没有意义的。

【讨论】:

  • 问题是我的计费逻辑基于 InvoiceLine,它只有所有类型我想要编译类型检查当我在发票中添加这个集合时它必须具有相同类型的交易
  • 另外值得注意的是 InvoiceLine 是通过 nhibernate 鉴别器映射的,所以真的不能改变结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2019-12-19
  • 1970-01-01
相关资源
最近更新 更多