public static void Main()
Console.WriteLine("Hello World");
var deal = GetDeal<ConcreateDeal,ConcreateDealInfo>();
public static TDeal GetDeal<TDeal, TDealInfo>()
where TDeal : DealBase<TDeal, TDealInfo>
where TDealInfo : DealInfoBase<TDeal, TDealInfo>
return new ConcreateDeal();
public class DealBase<TDeal, TDealInfo>
where TDeal : DealBase<TDeal, TDealInfo>
where TDealInfo : DealInfoBase<TDeal, TDealInfo>
public TDealInfo DealInfo {get; set;}
public class ConcreateDeal : DealBase<ConcreateDeal, ConcreateDealInfo> {}
public class DealInfoBase<TDeal, TDealInfo>
where TDeal : DealBase<TDeal, TDealInfo>
where TDealInfo : DealInfoBase<TDeal, TDealInfo>
public TDeal Deal {get; set;}
public class ConcreateDealInfo : DealInfoBase<ConcreateDeal, ConcreateDealInfo> { }