【问题标题】:Convert.ChangeType (Error: Object must implement IConvertible) when Dynamically Convert object to IList fails Why?Convert.ChangeType (Error: Object must implement IConvertible) when Dynamically Convert object to IList failed 为什么?
【发布时间】:2021-04-18 14:01:47
【问题描述】:

我正在使用Convert.ChangeType(object, Type) 方法将对象转换为其类型。它工作得很好。当我尝试将ObjectList<string> 类型)转换回List<string> 时,它工作得很好。但是,当我尝试将 Object 转换为 IList<string> 时,它失败了。

问题:当我尝试将应为 IList 类型的对象转换为 IList 时,它失败并显示错误消息“对象必须实现 IConvertible”

IList<string> myList = new List<string>();
object myObject = myList;
Type myType = typeOf(IList<string>);
Convert.ChangeType(myObject, myType);

任何人都知道如何成功地将对象转换回其原始类型的 IList ... 或者是否有人知道如何将最初是 IList 的对象转换为 List?两者都行。

【问题讨论】:

  • 您的声明 " 当我尝试将 Object(以前的类型为 List&lt;string&gt;)转换回 List&lt;string&gt; 时,它工作得很好。" 表示你的误解。如果一个对象是一个List&lt;string&gt;,它仍然是一个List&lt;string&gt;,即使你将一个对它的引用存储在一个object类型的变量中。没有必要改变它的类型;类型保持不变。
  • 它是一个 IList,而不是一个 List。没有误解。纠结这个太久了,不会是误会。主要是发布这个,所以其他人也不会为此感到挣扎。
  • 它既是 List&lt;string&gt; 也是 IList&lt;string&gt;。我的观点与ListIList 无关。如果我创建一个对象:object o = new List&lt;int&gt;();。该对象是List&lt;int&gt;IList&lt;int&gt;objectIEnumerable 等。如果我将对该对象的引用存储在任何这些类型的变量 (IEnumerable ie = (IEnumerable)o;) 中,它不会t 改变对象的基本性质(/类型)。
  • 好的,我明白你在说什么。该对象从未不是列表。可能是更好的表述方式。

标签: c# list dynamic


【解决方案1】:

以下代码解决了我的问题:

// Initial objects (the original IList object ended up as an object plus a Type)
IList<string> stringList = new List<string>(); // dont' have access to this form of the object
object myObject = stringList;
Type originalType = typeof(List<string>);

// Converting object to a List<string>
if(originalType.Name.StartsWith("IList"))
{
  Type myNewList = typeof(List<>);
  Type typeInIList = originalType.GenericTypeArguments[0];
  Type aStringListType = myNewList.MakeGenericType(typeInIList);
  dynamic newStringList = Convert.ChangeType(myObject, aStringListType);
}

【讨论】:

    【解决方案2】:

    无需使用Convert.ChangeTypedynamic。如果对象实际上是IList&lt;string&gt;,您可以使用is 类型模式来检查它:

    if (myObject is IList<string> list) {
        // "list" is the converted list
    } else {
        // conversion fails
    }
    

    【讨论】:

    • 感谢您的回答。对于我稍后在代码中对对象所做的事情,我确实需要将其转换回列表。
    猜你喜欢
    • 1970-01-01
    • 2022-11-20
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    相关资源
    最近更新 更多