using System.Collections.Generic;
public static void Main()
Console.WriteLine(c.AAs.Count);
Console.WriteLine(c.BBs[0].Invoices.GetType());
Console.WriteLine(c.CCs[0].Invoices.GetType().GenericTypeArguments[0].Name);
public class XXInvoice { }
public class XX<TInvoice> where TInvoice : XXInvoice
public List<TInvoice> Invoices;
public class AAInvoice : XXInvoice {}
public class AA : XX<AAInvoice> { }
public class BBInvoice : XXInvoice {}
public class BB : XX<BBInvoice> { }
public class CCInvoice : XXInvoice {}
public class CC : XX<CCInvoice> { }
public List<AA> AAs = InitializeInvoice<AA, AAInvoice>();
public List<BB> BBs = InitializeInvoice<BB, BBInvoice>();
public List<CC> CCs = InitializeInvoice<CC, CCInvoice>();
private static List<T> InitializeInvoice<T, TInvoice>()
where T: XX<TInvoice>, new()
where TInvoice : XXInvoice
Invoices = new List<TInvoice>()