如何在vb.net中确定值是否是泛型类型的实例,忽略类型参数?

时间:2010-03-27 00:21:40

标签: vb.net generics type-parameter

我有一个C级(Of T)。我想确定某个给定值是否具有类型C,而不管T是什么。例如,我可能想确定某个值是否是强类型列表,而不管列表存储的项目类型是什么。

我只需要知道如何在VB.net中完成它。在Java中,语法是这样的:

var result = obj instanceof Gen2<?>;

3 个答案:

答案 0 :(得分:4)

我相信您的问题的紧凑解决方案将是:

Dim result = (obj.GetType().GetGenericTypeDefinition().Equals(GetType(Gen2(Of ))))

说明:

  1. 获取表示实例obj
  2. 的基本类型的Type对象
  3. 获取编译器实例类型的基础类型。
  4. 获取没有限定参数的Gen2的泛型类型。
  5. 比较两个泛型,看它们是否相等并返回结果。
  6. 它不像你发布的Java解决方案那么紧凑(除非我错了,C#不支持instanceof关键字或Java通用通配符语法),但它可以工作。

    编辑:Cory Larson在下面的评论提示,我应该补充一点,虽然我发布的方法只适用于直接比较泛型和已知的泛型类型,如果你想知道它是否实现了通用接口,请使用:< / p>

    Dim result = (obj.GetType().GetGenericTypeDefinition().GetInterface(GetType(IMyGeneric(Of )).FullName) IsNot Nothing)
    

答案 1 :(得分:0)

当然,有点儿。例如:

    Dim obj As IList(Of Double) = New List(Of Double)
    Dim result As Boolean = obj.GetType().IsGenericType AndAlso _
        obj.GetType().GetGenericTypeDefinition().Equals(GetType(IList(Of )))

为此,结果为 False 。如果您将比较从IList(Of )更改为仅List(Of ),那么它可以正常工作。

    Dim obj As IList(Of Double) = New List(Of Double)
    Dim result As Boolean = obj.GetType().IsGenericType AndAlso _
        obj.GetType().GetGenericTypeDefinition().Equals(GetType(List(Of )))

将返回 True

编辑:Dang,Dan Story首先得到它。

答案 2 :(得分:0)

如果你想找出一个类型是否是Foo(Of T),因为你有兴趣使用一些不依赖于T的属性,我建议你应该在非 - 通用基类或非通用接口。例如,如果定义提供类似数组访问的ISuperCollection(Of T),则可以提供非泛型的ISuperCollection集合,该集合实现Count,RemoveAt,CompareAt,SwapAt和RotateAt方法(调用RotateAt(4,3,1))将从项目4开始旋转三个项目,向上一个点,从而用4,6替换项目5,用旧值6)替换项目5,并从中继承ISuperCollection(Of T)。

BTW,如果您将读取器接口与写入器接口隔离,则读取器接口可以是协变的,并且写入器接口是逆变的。如果任何属性或索引器同时实现读取和写入功能,则需要定义读写接口,其中包括任何此类属性或索引器的读写实现;有点麻烦,但恕我直言,值得额外的努力。