如何通过 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。它会告诉你数据的类型。
我有一个 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。它会告诉你数据的类型。