簡體   English   中英

通過C#中的反射分配給數組字段

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM