首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RunTime异常在Convert.ChangeType上的List<>实现

RunTime异常在Convert.ChangeType上的List<>实现
EN

Stack Overflow用户
提问于 2019-01-24 14:13:38
回答 2查看 2.4K关注 0票数 1

在尝试通过RunTime运行列表(强制转换为对象)时,我遇到了一个Convert.ChangeType异常。这基本上就是设置:

代码语言:javascript
复制
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);
    }
}

小提琴这里.

这将生成以下异常:

代码语言:javascript
复制
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转换为一个泛型类型的列表(如果它是一个列表),但我无法做到这一点。

有人知道如何解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-24 14:22:46

我通过在Utils.ChangeType中添加以下检查来解决这个问题:

代码语言:javascript
复制
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<>。

更新小提琴

票数 3
EN

Stack Overflow用户

发布于 2019-01-24 14:26:47

正如异常声明的那样,您试图使用的转换对象不实现IConvertible。您正在尝试将字符串列表转换为ints列表,而list类型没有实现所需的接口。

String和int类型确实实现了这个接口,所以您可以这样做:

代码语言:javascript
复制
  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!");

或者更简单地说:

代码语言:javascript
复制
  List<string> list = new List<string> { "1", "2", "3" };
  Utils utils = new Utils();
  var result = list.Select(Int32.Parse);
  Console.WriteLine("Done!");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54348620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档