被否决后的免责声明:
简而言之,最初的问题myObject
是返回时它是一种object
类型,HashSet<Availability>
在一种情况下可以转换为,但HashSet<Contact>
在另一种情况下可以转换为,等等。
我想遍历myObject
集合中的对象,无论它们是Availability
对象、Contact
对象还是其他东西。
我们确实找到了解决方案,并提供了更多的智慧来说明为什么这是一个令人讨厌的困境。非常感谢社区。
根据评论,您将看到原始问题做出了不正确的技术假设。我将其保留在下面并保持不变,作为任何可能与我有同样误解的人的学习机会。
原问题如下:
我有一个类型的对象object
,如果我调用GetType()
它,HashSet<Availability>
在一种情况下返回一种类型,但HashSet<Contact>
在另一种情况下返回不相关的类型,或者任意数量的未知HashSet<...>
类型。
object myObject = getMyObject();
myObject.GetType() // = HashSet<Availability>
我想将对象向上转换为某种集合(HashSet 或其他),同时将集合的泛型类型向下转换为对象,以便代码在编译时不必知道目前未知的类型。
object myObject = getMyObject();
myObject.GetType() // = HashSet<Availability>
var myUsefulObject = (HashSet<object>)myObject;
当我尝试此操作时,我收到“无法投射...”异常。
这可能吗?如果是这样,如何?
我相信我拥有的 HashSet 类型和我想要的 HashSet 类型之间存在协方差,但是因为我的初始类型只是一个对象,所以我无法执行此堆栈溢出答案所建议的操作。
正如您的问题下的长链评论所示 - 您不能强制转换HashSet<Availability>
为HashSet<object>
,因为这两种类型之间没有定义隐式\显式\任何其他转换。但是,HashSet<T>
实现了几个协变接口,例如IReadOnlyCollection<T>
and IEnumerable<T>
,并且您可以转换HashSet<Availability>
为这些接口(of object
):
object myObject = getMyObject();
var myUsefulObject = (IReadOnlyCollection<object>)myObject;
如果类型T
在接口中是协变的 - 此类型不能用作该接口中任何方法的参数,只能用作返回类型。这意味着在这种情况下可能破坏类型安全的所有方法(例如Add(T item)
,Remove(T item)
等等)都不能出现在这样的接口中,并且返回Availability
asobject
不是问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句