Я пытаюсь установить поле массива, используя отражение следующим образом:
FieldInfo field = ...
A[] someArray = GetElementsInSomeWay();
field.SetValue(this, someArray);
Поле имеет тип B[]
. B
наследуется от A
, а точный тип B
во время компиляции неизвестен. GetElementsInSomeWay()
возвращает A[]
, но все реальные элементы внутри являются B
. GetElementsInSomeWay()
является библиотечным методом и не может быть изменен.
Максимум, что я могу сделать, это получить B
с System.Type type = field.FieldType.GetElementType()
. Однако я не могу привести массив к требуемому типу, например. someArray as type[]
, потому что []
требует точного типа перед объявлением типа массива. Или я что-то здесь упускаю? Могу ли я объявить массив какого-либо типа, если тип становится известен во время выполнения с помощью переменной System.Type
?
Выполнение этого прямым способом приводит к следующей ошибке (здесь A
— это UnityEngine.Component
, а B
— это AbilityResult
, который также может быть одним из нескольких десятков других классов, унаследованных (возможно, через длинную цепочку наследования) от UnityEngine.Component
):
ArgumentException: Object type UnityEngine.Component[] cannot be converted to target type: AbilityResult[]
Parameter name: val
System.Reflection.MonoField.SetValue (System.Object obj, System.Object val, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Globalization.CultureInfo culture) (at /Applications/buildAgent/work/3df08680c6f85295/mcs/class/corlib/System.Reflection/MonoField.cs:133)
System.Reflection.FieldInfo.SetValue (System.Object obj, System.Object value) (at /Applications/buildAgent/work/3df08680c6f85295/mcs/class/corlib/System.Reflection/FieldInfo.cs:150)
B[]
, гдеB
неизвестен во время компиляции. - person Wiktor Zychla   schedule 09.12.2012