在C#中,您可以将对象类型向上转换为通用“对象”的集合类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中,您可以将对象类型向上转换为通用“对象”的集合类型相关的知识,希望对你有一定的参考价值。
我有一个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类型和我想要的那个之间有协方差,但因为我的初始类型只是一个对象我无法做什么this stack-overflow answer suggests。
正如您的问题下的长链评论所示 - 您无法将HashSet<Availability>
强制转换为HashSet<object>
,因为在这两种类型之间没有定义隐式 explicit 任何其他转换。但是,HashSet<T>
实现了几个协变接口,例如IReadOnlyCollection<T>
和IEnumerable<T>
,你可以将HashSet<Availability>
转换为那些接口(object
):
object myObject = getMyObject();
var myUsefulObject = (IReadOnlyCollection<object>)myObject;
如果类型T
在接口中是协变的 - 此类型不能在该接口中的任何方法中用作参数,并且只能用作返回类型。这意味着在这种情况下所有可能破坏类型安全性的方法(例如Add(T item)
,Remove(T item)
等)都不能出现在这样的界面中,并且返回Availability
作为object
不是问题。
以上是关于在C#中,您可以将对象类型向上转换为通用“对象”的集合类型的主要内容,如果未能解决你的问题,请参考以下文章