【发布时间】:2017-11-07 01:48:24
【问题描述】:
考虑以下问题: 我想在运行时用值填充 T 类型的数组。我能够获得所有持有这些实例之一的游戏对象(这里谈论 Unity3D)。这些游戏对象位于 results 数组中。 GetComponent 方法允许从游戏对象中提取 T 的实例,但会自动将其转换为 Ts 基类Component。 blueprint 包含有关绑定目标的信息,例如数组的 FieldInfo。
当前代码如下所示:
var arrayOfBaseClass =
(
from instance
in results
select instance.GetComponent(blueprint.Field.FieldType.GetElementType()))
.ToArray();
// Missing Step here
blueprint.Field.SetValue(o, arrayOfBaseClass);
SetValue 现在抛出 ArgumentException:对象类型 UnityEngine.Component[] 无法转换为目标类型:VEL.Input.ActionSignalReceiver[]
附加信息 arrayOfBaseClass 实际上是 T 的实例数组,只是通过 GetComponent 转换为基类型。如果我事先知道 T 手动转换为 T 将起作用并解决此问题。遗憾的是 T 事先不知道,并且可能在不同类型之间有所不同(但都派生自 Component)
现在的问题是,是否有办法使用 FieldInfo 的信息将数组转换回其最派生的类型。
【问题讨论】:
-
对阵列中的每个实例执行副本中提到的操作,然后就完成了。
-
我不认为这是链接问题的重复。首先,这不是将任意类转换为基类,其次,这个问题专门询问反射“SetValue”。我使用的类是派生类的实例,我只需要通过数组通过 SetValue 绑定它们。
-
从您的代码中很难看出
results、arrayOfDerivedClass以及arrayOfBaseClass实际上是什么。数组没有Field-property。 -
我重写并试图澄清要点。感谢您的意见!
标签: c# reflection