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

大卫

被否决后的免责声明:

简而言之,最初的问题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)等等)都不能出现在这样的接口中,并且返回Availabilityasobject不是问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将对象转换为C ++ / CLI中我不知道类型参数的通用列表?

来自分类Dev

C ++将对象强制转换为其原始类型

来自分类Dev

防止将对象强制转换为C ++以外的任何类型

来自分类Dev

我可以添加自己的类型转换运算符以将C ++对象转换为目标C吗?

来自分类Dev

C#将对象强制转换为存储在字符串变量中的另一种类型

来自分类Dev

C#将对象强制转换为存储在字符串变量中的另一种类型

来自分类Dev

C#从对象转换为模型类型

来自分类Dev

C#使用类型参数将对象强制转换为类

来自分类Dev

C ++可以消除异常对象的类型吗?

来自分类Dev

如何在不使用C#明确检查类型的情况下自动将对象转换为具体类型?

来自分类Dev

使用AutocompleteStringCollection时C#无法将对象类型数组转换为字符串类型数组

来自分类Dev

c ++是否可以将对象类型传递到要与之进行比较的函数中

来自分类Dev

c ++是否可以将对象类型传递到要与之进行比较的函数中

来自分类Dev

将对象模型转换为c#中的json?

来自分类Dev

Oracle Pro * C对象类型转换为C结构

来自分类Dev

无法将对象转换为指针C ++

来自分类Dev

c#无法在具有多个通用参数的方法中将对象强制转换为接口

来自分类Dev

C ++模板将功能转换为功能对象类型

来自分类Dev

C#LengthCalculator错误/需要转换为double类型的对象

来自分类Dev

将响应对象类型转换为列表 C#

来自分类Dev

我能否确定转换为父类的对象类型最初是否是C ++中的子类?

来自分类Dev

无法在C#中的PrivateObject中将类型对象隐式转换为字符串

来自分类Dev

对象不能从 DBNull 转换为 C# 中的其他类型异常

来自分类Dev

可以将派生对象转换为c ++模板类中的基本引用吗?

来自分类Dev

我可以在C ++中在运行时更改对象的类型吗

来自分类Dev

将对象的C#列表转换为对象的JavaScript数组

来自分类Dev

在C#中将通用类型参数转换为特定类型

来自分类Dev

将对象强制转换为通用类型失败

来自分类Dev

在运行时将对象转换为通用类型

Related 相关文章

  1. 1

    如何将对象转换为C ++ / CLI中我不知道类型参数的通用列表?

  2. 2

    C ++将对象强制转换为其原始类型

  3. 3

    防止将对象强制转换为C ++以外的任何类型

  4. 4

    我可以添加自己的类型转换运算符以将C ++对象转换为目标C吗?

  5. 5

    C#将对象强制转换为存储在字符串变量中的另一种类型

  6. 6

    C#将对象强制转换为存储在字符串变量中的另一种类型

  7. 7

    C#从对象转换为模型类型

  8. 8

    C#使用类型参数将对象强制转换为类

  9. 9

    C ++可以消除异常对象的类型吗?

  10. 10

    如何在不使用C#明确检查类型的情况下自动将对象转换为具体类型?

  11. 11

    使用AutocompleteStringCollection时C#无法将对象类型数组转换为字符串类型数组

  12. 12

    c ++是否可以将对象类型传递到要与之进行比较的函数中

  13. 13

    c ++是否可以将对象类型传递到要与之进行比较的函数中

  14. 14

    将对象模型转换为c#中的json?

  15. 15

    Oracle Pro * C对象类型转换为C结构

  16. 16

    无法将对象转换为指针C ++

  17. 17

    c#无法在具有多个通用参数的方法中将对象强制转换为接口

  18. 18

    C ++模板将功能转换为功能对象类型

  19. 19

    C#LengthCalculator错误/需要转换为double类型的对象

  20. 20

    将响应对象类型转换为列表 C#

  21. 21

    我能否确定转换为父类的对象类型最初是否是C ++中的子类?

  22. 22

    无法在C#中的PrivateObject中将类型对象隐式转换为字符串

  23. 23

    对象不能从 DBNull 转换为 C# 中的其他类型异常

  24. 24

    可以将派生对象转换为c ++模板类中的基本引用吗?

  25. 25

    我可以在C ++中在运行时更改对象的类型吗

  26. 26

    将对象的C#列表转换为对象的JavaScript数组

  27. 27

    在C#中将通用类型参数转换为特定类型

  28. 28

    将对象强制转换为通用类型失败

  29. 29

    在运行时将对象转换为通用类型

热门标签

归档