Как объявить переменную для открытого универсального типа? Возможный?
Есть ли способ объявить vaiable для открытого универсального типа?
Дано: Существует универсальный класс Logger, который пользователи получают из фабричного метода. Есть ли способ иметь переменную, которая может содержать ЛЮБОЙ регистратор?
Прямо сейчас Logger наследует только от Logger, чтобы иметь возможность объявлять переменную для экземпляра, не заботясь о том, какой тип там записан.
Я использую MEF, и в экспорте я могу использовать синтаксис, такой как [Export(typeof(Logger<>))], чтобы экспортировать универсальный тип... (указав точный тип при импорте), так что есть некоторая поддержка для открытых типов (по крайней мере, в typeof). Теперь мне нужен синтаксис
Logger<> Logger { get; задавать; }
Есть ли возможность сделать что-то подобное? Этот конкретный синтаксис заставляет меня "Тип необходим".
1 ответ
Если параметр типа Logger является ковариантным, т. Е. Если он объявлен с out
модификатор, то вы можете просто использовать Logger<object>
,
IEnumerable<object> = new List<string>; // this works, because IEnumerable is covariant
Если параметр типа Logger не ковариантен, т.е. если вы используете его в качестве входного параметра где-то, например Log(T dataToLog)
тогда реализация общего интерфейса (или использование общего базового класса) кажется единственным способом достижения вашей цели.