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