【问题标题】:Casting an object to a IList with an abstract type parameter使用抽象类型参数将对象强制转换为 IList
【发布时间】:2018-08-01 15:45:42
【问题描述】:

在我的代码中,我有一个对象:

object obj = ...

我知道的类型是 MyListType,其中 MyListType 是 IList 的子类,T 是 MyAbstractClass 的子类。 MyListType 的类型参数受到约束,因此它始终是 MyAbstractClass 的子类。

但是,尝试强制转换 obj

MyListType<MyAbstractClass> myList = (MyListType<MyAbstractClass>)obj;

给出运行时错误。

我试图定义一个显式的操作符

public static explicit operator MyListType<MyAbstractClass>(MyListType<T> list)
{
    MyListType<MyAbstractClass> newList = new MyListType<MyAbstractClass>();
    foreach(T t in list)
        newList.Add((MyAbstractClass) t);
    return newList;
}

但是,由于 obj 是一个对象,而不是 MyListType,因此强制转换不会使用此运算符。是否有成功执行此演员的解决方法?

我查看了this question,但他们的列表属于未知类型。

【问题讨论】:

  • 如果MyListType&lt;MyAbstractClass&gt; myList = (MyListType&lt;MyAbstractClass&gt;)obj; 给出运行时错误,那么obj 不是您认为的类型!
  • 能否编辑您的问题并粘贴类定义?
  • 类(和IList&lt;T&gt;)是不变的,所以MyList&lt;Subclass&gt; 不是MyList&lt;MyAbstractClass&gt; 的实例。不过,您可以将其转换为 IEnumerable&lt;MyAbstractClass&gt;
  • 你试过Convert.ChangeType(obj,typeof(MyListType&lt;MyAbstractClass&gt;))吗?
  • @Lee 行得通!我已将其添加为这篇文章的答案。

标签: c# .net generics


【解决方案1】:

我最终重新编写了我的代码,这样我就不必这样做了,但解决方案是首先将其强制转换为 IEnumerable,然后将 IEnumerable 添加到列表中。

MyListType<MyAbstractClass> list = new MyListType<MyAbstractClass>();
IEnumerable<MyAbstractClass> enumerable = obj as IEnumerable<MyAbstractClass>;
list.AddRange(enumerable);

【讨论】:

  • 或更简单的:var list = ((IEnumerable&lt;MyAbstractClass&gt;) obj).ToList();
猜你喜欢
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多