簡體   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