通过反射实例化不可访问类的数组

本文关键字:访问 数组 反射 实例化 | 更新日期: 2023-09-27 18:13:37

我目前正在使用Unity3D引擎帮助开发一款游戏。我们需要使用Curve Editor来描述给定法术的伤害等级。在Unity3D引擎的c#汇编中已经有一个具有所需功能的曲线编辑器类,但它是不可访问的。我试图通过反射实例化该类型的对象。然而,我遇到了一个问题。该类的构造函数需要几个参数,其中1个恰好是另一个不可访问类的数组。问题来了。我能够通过反射构造一个对象,但不是该类型的对象数组。下面是构造函数:

public CurveEditor(Rect rect, CurveWrapper[] curves, bool minimalGUI){...}

我能够用Reflection构建CurveWrapper对象,但不是整个数组。我试图创建Object[]数组,并把一些CurveWrapper对象在里面,但当我通过反射将这个数组传递给构造函数时,我得到无效参数异常。

有人能帮我解决这个问题吗?

通过反射实例化不可访问类的数组

我猜你是在找Array.CreateInstance

Type type = ...; // However you get to CurveWrapper
IList array = Array.CreateInstance(type, 2);
array[0] = Activator.CreateInstance(type);
array[1] = Activator.CreateInstance(type);

我不得不说,如果CurveEditor是不可访问的,我不会试图得到它非常反射。即使它现在可以工作,我认为Unity3D人员以后对它做出不兼容的改变也是完全合理的。使用非公共api会导致代码非常脆弱。

如果你在Unity3D中为某些东西编写编辑器,那么大多数,如果不是全部,你需要的是EditorGUI助手的一部分,如EditorGUI.CurveField,它将在检查器中为你呈现曲线编辑器(如果你正在为正确类型的对象使用编辑器类)。

不需要手动实例化。