Насколько я понимаю из вашей ситуации, использование System.Array
вместо более конкретного массива может вам помочь. Помните, Array
является базовым классом для всех строго типизированных массивов, поэтому ссылка Array
может хранить практически любой массив. Вы должны составить свою (универсальную?) Словарную карту Type -> Array
, чтобы вы могли хранить любой строго типизированный массив, не беспокоясь о необходимости преобразования одного массива в другой, теперь это просто приведение типов.
т.е.,
Dictionary<Type, Array> myDict = ...;
Array GetFoos(Type t)
{
// do checks, blah blah blah
return myDict[t];
}
// and a generic helper
T[] GetFoos<T>() where T: Foo
{
return (T[])GetFoos(typeof(T));
}
// then accesses all need casts to the specific type
Foo[] f = (Foo[])GetFoos(typeof(Foo));
DerivedFoo[] df = (DerivedFoo[])GetFoos(typeof(DerivedFoo));
// or with the generic helper
AnotherDerivedFoo[] adf = GetFoos<AnotherDerivedFoo>();
// etc...
p.s., Предоставленная вами ссылка на MSDN показывает ковариантность массивов. То есть вы можете хранить массив более производного типа в ссылке на массив базового типа. Здесь вы пытаетесь достичь контравариантности (т. Е. Использования массива базового типа вместо массива более производного типа), что является противоположным способом, и что массивы не могут сделать без преобразования.