在C#中,您可以将对象类型向上转换为通用“对象”的集合类型

问题描述 投票:-2回答:1

我有一个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

c# types casting type-conversion covariance
1个回答
0
投票

正如您的问题下的长链评论所示 - 您无法将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不是问题。

© www.soinside.com 2019 - 2024. All rights reserved.