我有一个object
类型的对象,如果我在其上调用GetType()
,则在一种情况下返回HashSet<Availability>
类型,但返回不相关类型的HashSet<Contact>
在另一种情况下,或任何数量的尚未知的HashSet<...>
类型。
object myObject = getMyObject();
myObject.GetType() // = HashSet<Availability>
我想将对象向上转换为某种类型的集合(HashSet或其他),同时将集合的泛型类型转换为对象,以便代码不必知道as-编译时尚未知类型。
object myObject = getMyObject();
myObject.GetType() // = HashSet<Availability>
var myUsefulObject = (HashSet<object>)myObject;
当我尝试这个时,我得到一个&#34;无法施放......&#34;异常。
这可能吗? 如果是这样,怎么样?
我相信我拥有的HashSet类型和我想要的HashSet类型之间的协方差,但因为我的初始类型只是一个对象,我无法做this stack-overflow answer suggests。< / p>
答案 0 :(得分:0)
根据您的问题显示的长链评论显示 - 您无法将HashSet<Availability>
强制转换为HashSet<object>
,因为在这两种类型之间没有定义隐式\ explicit \ any任何其他转换。但是,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
返回不是问题。