我正在尝试将列表强制转换为类型,但是在以下行上遇到了问题:
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;
}
}
答案 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];