通用约束将集合限制为具有相同类型的派生对象

时间:2017-03-17 09:17:10

标签: c# generics generic-constraints

我想限制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包含相同类型的TransactionLine,而不是PermTransactionLineTempTransactionLine  在同一时间。 TransactionLine必须是抽象的 - 不想直接创建对象。

我正在尝试添加new() constaint,但它没有工作说:

  

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以定义

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

并为每个XXXInvoiceLine使用适当的XXXTransactionLine

在这种特殊情况下,没有必要定义T : new()约束。