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