[英]Assigning to an array field through reflection in c#
我使用反射在类中获取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方法用转换后的值填充新的数组元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.