代码之家  ›  专栏  ›  技术社区  ›  Get Off My Lawn

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

  •  1
  • Get Off My Lawn  · 技术社区  · 7 年前

    我试图将列表强制转换为类型,但在以下行中出现问题:

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

    我有个错误说它不能 从源类型到目标类型 . 但是,如果我改变 List<object> List<int> 它起作用了。我不能这样做,因为这个列表很可能不是 int 每次都是动态的。

    有没有 Invoke 或者我可以做些什么来传递一个类型作为参数来表示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 回复  |  直到 7 年前
        1
  •  1
  •   canton7    7 年前

    正如评论中所讨论的,你真正想要的是 List<object> (每一个) object 实际上是 T ,可能是装箱值类型),并将其转换为 List<T> 或A T[] ,取决于bool标志。

    最简单的方法是稍微修改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
  •   nvoigt    7 年前

    看来你不需要 List<> . 你只需要一个 IEnumerable<> .

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

    为什么会这样 列表& lt; 没有?因为一个 IEnumerable<int> IEnumerable<object> . 但一 List<int> List<object> ,如果是的话,你可以 .Add(new Object()) 清单& lt;int & gt; .

        3
  •  -2
  •   José Bonadero    7 年前

    列表已准备好作为数组使用。如果你有:

    List<object> MyList;
    

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

    object obj = MyList[2];