Я стараюсь использовать дженерики как можно чаще, и ограничения, конечно, очень помогают. Но иногда ограничения вынуждают меня вызывать универсальный метод из универсального метода с использованием отражения, потому что ограничения не совпадают. Пример:
Код: Выделить всё
void Method1(this object obj, T value)
{
if(value.GetType().IsValueType)
{
obj.Method2(value);// Won't work without reflection
}
}
void Method2(this object obj, T value) where T : struct
{
...
}
Я могу использовать контракты для таких вещей, как предположение, что значение не равно нулю – но есть ли что-нибудь подобное для общих ограничений? Нравится:
Обновление: @Sweeper дал мне URI. Как условно вызвать универсальный метод с ограничениями? в комментариях, которые на первый взгляд выглядели многообещающе. Но когда я меняю свой код на
Код: Выделить всё
void Method1(this object obj, T value)
{
if(value.GetType().IsValueType)
{
obj.Method2((dynamic)value);// Error CS1973
}
}
Visual Studio сообщает, что «метод расширения не может быть привязан динамически». Я не предполагал, что для методов расширения существуют разные правила, поэтому мне пришлось обновить примеры.
Подробнее здесь:
https://stackoverflow.com/questions/792 ... constraint