Динамическая проверка констрейнтов
От: nikov США http://www.linkedin.com/in/nikov
Дата: 03.09.08 13:15
Оценка:
Вот такой код на C#:

using System.Collections;
using System.Reflection;

class Program
{
    static void Main()
    {
        Foo<IEnumerable>("");
    }

    static void Foo<T>(T x)
    {
        // if(T implements IEnumerable)
        if(typeof (IEnumerable).IsAssignableFrom(typeof (T)))
        {
            // Bar<T>(x);
            typeof (Program).GetMethod(
                "Bar", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(typeof (T)).Invoke(
                null, new object[] {x});
        }
    }

    static void Bar<T>(T x) where T : IEnumerable
    {
    }
}


Видно, что хочется сделать: динамически (в runtime) проверить, удовлетворяет ли тип-параметр некоторому констрейнту, и если удовлетворяет, то передать его в качестве типа-аргумента в другой метод, статически требующий этого констрейнта. Насколько я понимаю, система типов в C# не позволяет сделать такой трюк, и вывернуться можно только с использованием рефлексии.
Вопрос: есть ли языки (не обязательно под .NET), которые поддерживают такое на уровне системы типов? Насколько это вообще здравая идея?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.