次のようなリフレクションを使用して配列フィールドを設定しようとしています:
FieldInfo field = ...
A[] someArray = GetElementsInSomeWay();
field.SetValue(this, someArray);
フィールドのタイプはB[]
です。B
から継承されA
、の正確な型はB
コンパイル時にわかりません。
GetElementsInSomeWay()
を返しますA[]
が、内部の実際の要素はすべてB
です。GetElementsInSomeWay()
はライブラリ メソッドであり、変更できません。
私ができることは、せいぜいB
withを取得することSystem.Type type = field.FieldType.GetElementType()
です。ただし、配列型を宣言する前に正確な型が必要なsomeArray as type[]
ため、配列を必要な型にキャストできません
。[]
それとも、ここで何か不足していますか? System.Type
型が変数を使用して実行時に認識されるようになった場合、その型の配列を宣言できますか?
直接の方法で実行すると、次のエラーが発生します (ここにA
ある isUnityEngine.Component
とB
is はAbilityResult
、数十個の他のクラスの 1 つである場合もあり、すべてが から (おそらく長い継承チェーンを介して) 継承されます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)