在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#中,您可以将对象类型向上转换为通用“对象”的集合类型的主要内容,如果未能解决你的问题,请参考以下文章

java向上转型和向下转型

将通用JS集合转换为具有特定键和分组值的对象

在java中,两个子类可否互相转换?

我们可以在 javascript 中将通用对象转换为自定义对象类型吗?

10.3 对象类型的转换

Java多态对象的类型转换和动态绑定