如何将对象转换为List <object>并将其转换为数组?

时间:2019-02-07 17:09:10

标签: c# unity3d

我正在尝试将列表强制转换为类型,但是在以下行上遇到了问题:

value = isArray ? ((List<object>)value).ToArray() : value;

我收到一条错误消息,说它不能将从源类型转换为目标类型。但是,如果我将List<object>更改为List<int>,它将起作用。我之所以不能这样做,是因为该列表是动态的,因此很可能不会每次都是int

是否存在Invoke或我可以做的事情来传递类型作为参数,以说调用将返回List<x>(其中x是某种动态类型)?

var castMethod = this.GetType().GetMethod("CastList").MakeGenericMethod(type);
value = castMethod.Invoke(null, new object[] { value });
value = isArray ? ((List<object>)value).ToArray() : value;

public static List<T> CastList<T>(List<object> o) {
    var list = new List<T>();
    foreach (var i in o) { list.Add((T)i); }
    return list;
}

最后,value的值将是列表或数组。

编辑

这是完整的方法:

void SaveDataLocal() {
    keyValues.ForEach(item => {
        var field = GameData.save.GetType().GetField(item.key);
        var value = GetValue(item);
        var isArray = field.FieldType.IsArray;
        var isList = IsList(value);

        // Convert arrays to proper types
        if (isArray || isList) {
            Type type;
            // Get the array type
            if (isArray) type = field.FieldType.GetElementType();
            // Get the list type
            else type = field.FieldType.GetGenericArguments().Single();
            // Do the cast
            var castMethod = this.GetType().GetMethod("CastList").MakeGenericMethod(type);
            value = castMethod.Invoke(null, new object[] { value });
            value = isArray ? ((List<object>)value).ToArray() : value;
        }

        field.SetValue(GameData.save, value);
    });
    GameData.Save();
}

这是我的键/值对象:

class KeyValue {
    public string key;
    public object value;

    public KeyValue(string key, object value) {
        this.key = key;
        this.value = value;
    }
}

3 个答案:

答案 0 :(得分:3)

似乎您实际上并不需要List<>。您只需要一个IEnumerable<>

(IEnumerable<object>)value).ToArray()

为什么这样做有效,而List<>却没有呢?因为IEnumerable<int> IEnumerable<object>。但是List<int>不是List<object>,而是.Add(new Object())List<int>

答案 1 :(得分:1)

正如评论中所讨论的,实际上您要使用的是List<object>(每个object实际上是T,并且可能是装箱的值类型),然后根据布尔标志将其转换为List<T>T[]

最简单的方法是稍微修改CastList方法:

var castMethod = this.GetType().GetMethod("CastList").MakeGenericMethod(type);
value = castMethod.Invoke(null, new object[] { value, isArray });

public static object CastList<T>(List<object> o, bool isArray) {
    var result = o.Cast<T>();
    return isArray ? (object)result.ToArray() : result.ToList();
}

答案 2 :(得分:-3)

列表已经准备好作为数组工作。如果您有:

List<object> MyList;

然后您可以将其用作数组。例如:

object obj = MyList[2];