繁体   English   中英

如何通过 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 和其他我的类)非常有用。 但是当我尝试通过这种方法将数据设置为数组时:

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:“System.Object[]”类型的 Object 无法转换为“Game.GameEvents.GameEventConfig+RewardSettings[]”类型。

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

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

或者你能告诉我如何以不同的方式做吗? Ps 我不能严格设置类型,因为这样的字段很多,没有一种类型。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM