Страницы

Поиск по вопросам

пятница, 24 мая 2019 г.

Странное поведение ограничений в обобщенном методе

Всем доброго времени суток. Может быть кто-то уже сталкивался с таким и может помочь?
public static class JSON { public static string Serialize_object_TO_JSON(this T Entity) where T:ENT { return JsonConvert.SerializeObject(Entity); }
}
Есть некий класс, который наследует ENT и передавать его в атрибуты можно. Дальше мне пришлось переделать метод так, чтоб она работал с коллекциями:
public static class JSON { public static string Serialize_object_TO_JSON(this T Entity) where T:List { return JsonConvert.SerializeObject(Entity); }
}
После чего компилятор говорит, что ему не удалось привести тип класса, который наследуется от ENT, к типу List.
P.S. Изначально задавать обобщение конечного класса я не могу, т.к. их довольно много, именно по этому попытался делать через наследование.


Ответ

Попробуйте так, если Вам это разрешает бизнес логика:
public static class JSON { public static string Serialize_object_TO_JSON(this T Entity) where T : IEnumerable { return JsonConvert.SerializeObject(Entity); } }
Дело в том что List - инвариантен. И все классы в .NET инвариантны. То есть это полное соответствие типов.
Означает, что можно использовать только изначально заданный тип. Таким образом, параметр инвариантного универсального типа не является ни ковариантным, ни контравариантным.
С другой стороны есть IEnumerable где тип-параметр T помечен как out - ковариантным.
Позволяет использовать тип с большей глубиной наследования, чем задано изначально.
Полное описание почему так
+1 за хороший пример

Комментариев нет:

Отправить комментарий