[英]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.