在尝试通过RunTime运行列表(强制转换为对象)时,我遇到了一个Convert.ChangeType异常。这基本上就是设置:
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<string> list = new List<string>{ "1", "2", "3"};
Utils utils = new Utils();
utils.ChangeType(list, typeof(List<int>));
Console.WriteLine("Done!");
}
}
public class Utils
{
public object ChangeType(object obj, Type type)
{
return Convert.ChangeType(obj, type);
}
}小提琴这里.
这将生成以下异常:
Run-time exception (line 19): Object must implement IConvertible.
Stack Trace:
[System.InvalidCastException: Object must implement IConvertible.]
at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType)
at Utils.ChangeType(Object obj, Type type) :line 19
at Program.Main() :line 10我不知道怎么解决这个问题。我认为我应该将Utils.ChangeType中的对象obj转换为一个泛型类型的列表(如果它是一个列表),但我无法做到这一点。
有人知道如何解决这个问题吗?
发布于 2019-01-24 14:22:46
我通过在Utils.ChangeType中添加以下检查来解决这个问题:
if (IsList(obj))
{
List<object> objs = ((IEnumerable)obj).Cast<object>().ToList();
Type containedType = type.GenericTypeArguments.First();
return objs.Select(item => Convert.ChangeType(item, containedType)).ToList();
}IsList是Utils中的一个泛型函数,用于检查对象是否为List<>。
见更新小提琴。
发布于 2019-01-24 14:26:47
正如异常声明的那样,您试图使用的转换对象不实现IConvertible。您正在尝试将字符串列表转换为ints列表,而list类型没有实现所需的接口。
String和int类型确实实现了这个接口,所以您可以这样做:
List<string> list = new List<string> { "1", "2", "3" };
Utils utils = new Utils();
var result = list.Select(o => (int)Convert.ChangeType(o, typeof(int)));
Console.WriteLine("Done!");或者更简单地说:
List<string> list = new List<string> { "1", "2", "3" };
Utils utils = new Utils();
var result = list.Select(Int32.Parse);
Console.WriteLine("Done!");https://stackoverflow.com/questions/54348620
复制相似问题