Если ваш класс должен иметь установщик на этом IEnumerable<T>
, то он не может быть ковариантным. Ковариация только для чтения, контравариация только для записи. Если вам нужны оба варианта, а также требуется набор таких конфигураций, тогда ваш дизайн имеет недостатки.
Если вы хотите иметь только get
доступ к этому свойству, то сначала вам нужно создать интерфейс для вашего класс, так как дисперсия работает только на универсальных c интерфейсах:
public interface ISpreadsheetConfiguration<out T> where T : class
{
IEnumerable<T> ExportData { get; }
}
public class SpreadsheetConfiguration<T> : ISpreadsheetConfiguration<T> where T : class
{
public IEnumerable<T> ExportData {get; set;}
}
Обратите внимание на ключевое слово out
в объявлении параметра типа интерфейса - это означает, что ISpreadsheetConfiguration<T>
является ковариантным в T
.
Теперь вы можете сделать это:
public byte[] ExportMultipleSheets(IEnumerable<ISpreadsheetConfiguration<object>> toExport);
var toExport = new ISpreadsheetConfiguration<object>[]
{
new SpreadsheetConfiguration<MyOtherClass>(),
new SpreadsheetConfiguration<CompletelyDifferentClass>()
};
ExportMultipleSheets(toExport);
Подробнее о дисперсии и о том, почему ковариация не может работать с типом, который разрешает как чтение, так и запись с типом T
здесь .