我有一个C级(Of T)。我想确定某个给定值是否具有类型C,而不管T是什么。例如,我可能想确定某个值是否是强类型列表,而不管列表存储的项目类型是什么。
我只需要知道如何在VB.net中完成它。在Java中,语法是这样的:
var result = obj instanceof Gen2<?>;
答案 0 :(得分:4)
我相信您的问题的紧凑解决方案将是:
Dim result = (obj.GetType().GetGenericTypeDefinition().Equals(GetType(Gen2(Of ))))
说明:
obj
Gen2
的泛型类型。它不像你发布的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,如果您将读取器接口与写入器接口隔离,则读取器接口可以是协变的,并且写入器接口是逆变的。如果任何属性或索引器同时实现读取和写入功能,则需要定义读写接口,其中包括任何此类属性或索引器的读写实现;有点麻烦,但恕我直言,值得额外的努力。