通过c#中的反射分配给数组字段

本文关键字:数组 字段 分配 反射 通过 | 更新日期: 2023-09-27 18:24:49

我使用反射来获取类中的FieldInfos,并使用FieldInfo.SetValue为其赋值。当我分配基元类型时(我使用Convert.ChangeType从对象转换为类型),它很好,但如果字段是数组,它就不起作用。如果我使用Array.Cast,它是有效的,但类型只有在运行时才知道,所以我不能强制转换。我看到了很多关于这方面的话题,但到目前为止没有一个奏效。

我得到这个例外:

ArgumentException:对象类型System.Object[]无法转换为目标类型:System.Single[]

我知道为什么会发生这种情况,只是找不到转换数据的方法。有什么想法吗?

编辑:相关代码:

 public static object Deserialize (string path){
        string[] lines = File.ReadAllLines(path);
        ConstructorInfo ci = type.GetConstructor(Type.EmptyTypes);
        object newObj = ci.Invoke(new object[] {});
        Type type = Type.GetType(lines[0], true);
        FieldInfo[] fields = type.GetFields(BindingFlags.Public);

        for (int i = 1; i < lines.Length; i++){
            FieldInfo thisField = currentType.GetField(lines[i]);
                if (thisField != null) {
                    if (line != "") {
                        if (fieldType == typeof(string)) {
                            thisField.SetValue(currentObject, line);
                            thisField = null;
                        }
                        else if (fieldType.IsPrimitive) {
                            val = Convert.ChangeType(line, fieldType);
                            thisField.SetValue(currentObject, val);
                            thisField = null;
                        }
                        else if (fieldType.IsArray){
                            string[] values = ReadUntil(']');
                            //ReadUntil just returns the values as string[] as read from text file
                            object[] newValues = Convert.ChangeType(values, fieldType);
                            thisField.SetValue(newObj, newValues);
                        }
                    }
                }
            }
        }
        return newObj;
    }

通过c#中的反射分配给数组字段

您可以使用类似的东西

else if (fieldType.IsArray)
{
    string[] values = ReadUntil(']');
    var elementType = fieldType.GetElementType();
    if (elementType == typeof(string))
        thisField.SetValue(newObj, values);
    else
    {
        var actualValues = Array.CreateInstance(elementType, values.Length);
        for (int i = 0; i < values.Length; i++)
            actualValues.SetValue(Convert.ChangeType(values[i], elementType), i);
        thisField.SetValue(newObj, actualValues);
    }
}

Type.GetElementType方法用于检索数组元素的类型,然后使用array.CreateInstance方法创建所需类型的数组,最后使用array.SetValue方法用转换后的值填充新的数组元素。