Как правило, вам придется либо использовать List<object>
, либо создать неуниверсальный базовый класс, например,
public abstract class ValuePair
{
public string Name { get; set;}
public abstract object RawValue { get; }
}
public class ValuePair<T> : ValuePair
{
public T Value { get; set; }
public object RawValue { get { return Value; } }
}
Тогда вы можете иметь List<ValuePair>
.
Теперь есть одно исключение из этого: ковариантные / контравариантные типы в C # 4. Например, вы можете написать:
var streamSequenceList = new List<IEnumerable<Stream>>();
IEnumerable<MemoryStream> memoryStreams = null; // For simplicity
IEnumerable<NetworkStream> networkStreams = null; // For simplicity
IEnumerable<Stream> streams = null; // For simplicity
streamSequenceList.Add(memoryStreams);
streamSequenceList.Add(networkStreams);
streamSequenceList.Add(streams);
Это не применимо в вашем случае, потому что:
- Вы используете универсальный класс, а не интерфейс
- Вы не можете изменить его на общий ковариантный интерфейс, потому что у вас есть
T
выход "в" и"выход" из API
- Вы используете типы значений в качестве аргументов типа, и они не работают с универсальной переменной (поэтому
IEnumerable<int>
не IEnumerable<object>
)