TypeList for .NET или Вспомнилось метапрограммирование в C++
От: alexanderfedin США http://alexander-fedin.pixels.com/
Дата: 07.12.06 19:27
Оценка:
    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>>>>>>>>>>();
        }
    }
Respectfully,
Alexander Fedin.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.