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