Контракт на ограничение аргумента универсального типаC#

Место общения программистов C#
Ответить
Anonymous
 Контракт на ограничение аргумента универсального типа

Сообщение Anonymous »

Я стараюсь использовать дженерики как можно чаще, и ограничения, конечно, очень помогают. Но иногда ограничения вынуждают меня вызывать универсальный метод из универсального метода с использованием отражения, потому что ограничения не совпадают. Пример:

Код: Выделить всё

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
{
...
}
Я могу использовать контракты для таких вещей, как предположение, что значение не равно нулю – но есть ли что-нибудь подобное для общих ограничений? Нравится:

Код: Выделить всё

Contract.Assert(T is 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»