public interface ITypeList
{
IEnumerable<Type> Enum();
}
public struct TLEND : ITypeList
{
public IEnumerable<Type> Enum()
{
yield break;
}
}
public struct TL<Value, Next> : ITypeList
where Next : ITypeList, new()
{
public IEnumerable<Type> Enum()
{
yield return typeof(Value);
foreach (Type nextType in new Next().Enum())
{
yield return nextType;
}
}
}
public struct TLUtil
{
public static ITypeList Make<T0>()
{
return new TL<T0, TLEND>();
}
public static ITypeList Make<T0, T1>()
{
return new TL<T0, TL<T1, TLEND>>();
}
public static ITypeList Make<T0, T1, T2>()
{
return new TL<T0, TL<T1, TL<T2, TLEND>>>();
}
public static ITypeList Make<T0, T1, T2, T3>()
{
return new TL<T0, TL<T1, TL<T2, TL<T3, TLEND>>>>();
}
public static ITypeList Make<T0, T1, T2, T3, T4>()
{
return new TL<T0, TL<T1, TL<T2, TL<T3, TL<T4, TLEND>>>>>();
}
public static ITypeList Make<T0, T1, T2, T3, T4, T5>()
{
return new TL<T0, TL<T1, TL<T2, TL<T3, TL<T4, TL<T5, TLEND>>>>>>();
}
public static ITypeList Make<T0, T1, T2, T3, T4, T5, T6>()
{
return new TL<T0, TL<T1, TL<T2, TL<T3, TL<T4, TL<T5, TL<T6, TLEND>>>>>>>();
}
public static ITypeList Make<T0, T1, T2, T3, T4, T5, T6, T7>()
{
return new TL<T0, TL<T1, TL<T2, TL<T3, TL<T4, TL<T5, TL<T6, TL<T7, TLEND>>>>>>>>();
}
public static ITypeList Make<T0, T1, T2, T3, T4, T5, T6, T7, T8>()
{
return new TL<T0, TL<T1, TL<T2, TL<T3, TL<T4, TL<T5, TL<T6, TL<T7, TL<T8, TLEND>>>>>>>>>();
}
public static ITypeList Make<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>()
{
return new TL<T0, TL<T1, TL<T2, TL<T3, TL<T4, TL<T5, TL<T6, TL<T7, TL<T8, TL<T9, TLEND>>>>>>>>>>();
}
}