通过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;
}
您可以使用类似的东西
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方法用转换后的值填充新的数组元素。