如何通过 FieldInfo C# 创建数组

How to create array by FieldInfo c#

我有一个 FieldInfo,但我不知道它是什么类型(其中之一)。我保存在 PortDataFieldSpecial class:

public class PortDataFieldSpecial : FieldSpecial
{
    public FieldInfo FieldInfo;
    public Port Port;

    public override VisualElement FieldVisualElement => Port;

    public PortDataFieldSpecial(NodePortAttribute nodePort, FieldInfo fieldInfo, BaseNodeView nodeView) : base(fieldInfo)
    {
        FieldInfo = fieldInfo;
        Port = BuildNode.Instance.GeneratePort(nodePort, fieldInfo, nodeView);
    }
}

这个 class 只是为我的程序(任务节点编辑器)生成视图端口,并在值更改时调用方法。这很好地处理了单一类型的数据(如 int、float、string 和其他我的 classes)。但是当我尝试通过这种方法将数据设置为数组时:

foreach(var port in allFieldPorts)
{
    var list = fullGraphData.GetOtherNode(port.Port, this);
    
    if(port.Port.capacity == Port.Capacity.Multi)
    {
        List<object> fieldArray = new List<object>();
        foreach(var otherNode in list)
        {
            fieldArray.Add(otherNode.GetData());
        }

        if(port.FieldInfo.FieldType.IsArray)
        {
            var array = fieldArray.ToArray();
            if(array.Length > 0)
            {
                port.FieldInfo.SetValue(node, array);
            }
        }
    }
    else
    {
        foreach(var otherNode in list)
        {
            portsFieldInfo.SetValue(node, otherNode.GetData());
        }
    }
}

在此图上:

遇到异常:

ArgumentException: Object of type 'System.Object[]' cannot be converted to type 'Game.GameEvents.GameEventConfig+RewardSettings[]'.

如何创建 FieldInfo.FieldType 类型的列表? 类似的东西:

List<typeof(port.FieldInfo.FieldType)> fieldList =
    new List<typeof(port.FieldInfo.FieldType)>();

或者你能告诉我如何以不同的方式做吗? P.s。不能硬性规定类型,因为这样的字段很多,不是一种类型。

异常告诉你类型的名称。它是 Game.GameEvents.GameEventConfig.RewardSettings[],即 RewardSettings 的数组,其中类型 RewardSettings 嵌套在 GameEventConfig 中(因此类型名称中的 +,但加号sign 是 IL 表示法,不是 C# 表示法。在 C# 中用 '.' 替换它)。

因此,创建一个这种类型的数组并将数据转换为它。

您不能使用 Type 对象作为泛型类型的类型参数。泛型在编译时解析。您可以使用 Reflection 通过在运行时解析类型参数来创建通用对象;然而,这很少有用,因为从那时起你将不得不使用反射来处理这个对象。

我认为你可以用 FieldInfo 做的最好的事情是使用它一个 if-else 语句来分支到适当的情况,如果你正在(反)序列化的数据不总是相同的类型.但我怀疑它是。

请注意,您始终可以调试代码。设置断点,例如在行 fieldArray.Add(otherNode.GetData()); 上,当执行在该行停止时,将表达式 otherNode.GetData() 添加到 Quick Watch Window。它会告诉你数据的类型。