.net TypeOf是myType
作为对象的公共MyObj.net TypeOf是myType,.net,vb.net,typeof,.net,Vb.net,Typeof,作为对象的公共MyObj Public Function Test(t as Type) as Boolean Return TypeOf MyObj is t ' does not work End Function 谢谢 *编辑 ==================================================================== 为了清楚起见,我将使用一个完整的例子,一个最初被认为有点修改的例子 我使用一个接口,希望知道传入参数的对象(实现I)是否与内
Public Function Test(t as Type) as Boolean
Return TypeOf MyObj is t ' does not work
End Function
谢谢
*编辑
====================================================================
为了清楚起见,我将使用一个完整的例子,一个最初被认为有点修改的例子
我使用一个接口,希望知道传入参数的对象(实现I)是否与内部字段的类型相同(I;a:I;AA:a;B:I)
首先,(a)我需要准确的类标识(只有a=a,B=B,AA=AA)
我还希望有一个“继承等价性”(a=a和a=AA,但AB)
你可以简单地做:
Return GetType(MyObj).Equals(t)
你可以简单地做:
Return GetType(MyObj).Equals(t)
与比较类型是否相等不同,您可能希望使用: 如果查看运算符文档,您会发现它需要一个类型名作为第二个操作数。此类型名称在编译时解析 编辑:如果你真的想要完全相等,那么
TypeOf。。。是…
无论如何都不会对你有用
至于区别,请考虑:
MyObj = New MemoryStream()
...
Dim result = Test(GetType(Stream))
您希望结果为真还是假?如果希望它为false,则应使用简单等式:
return t is MyObj.GetType()
如果您希望它是真的,因为MyObj
与Stream
的赋值兼容,您应该使用此答案顶部的代码。这就是MyObject Is Stream的类型的行为,这就是我最初回答的原因
编辑:好的,回答更改后的问题:
Function SameTypeAs(ByVal iObj As I) As Boolean
Return Me.objI.GetType() = iObj.GetType()
End Function
Function CompatibleType(ByVal iObj As I) As Boolean
Return Me.objI.GetType().IsAssignableFrom(iObj.GetType())
' Or this depending on which way round you want compatibility
' Return iObj.GetType().IsAssignableFrom(Me.objI.GetType())
End Function
请注意,这不是空安全的-如果您传入Nothing
或Me.objI
为Nothing,则调用GetType()
时会出现NullReferenceException
,而不是比较类型是否相等,您可能希望使用:
如果查看运算符文档,您会发现它需要一个类型名作为第二个操作数。此类型名称在编译时解析
编辑:如果你真的想要完全相等,那么TypeOf。。。是…
无论如何都不会对你有用
至于区别,请考虑:
MyObj = New MemoryStream()
...
Dim result = Test(GetType(Stream))
您希望结果为真还是假?如果希望它为false,则应使用简单等式:
return t is MyObj.GetType()
如果您希望它是真的,因为MyObj
与Stream
的赋值兼容,您应该使用此答案顶部的代码。这就是MyObject Is Stream的类型的行为,这就是我最初回答的原因
编辑:好的,回答更改后的问题:
Function SameTypeAs(ByVal iObj As I) As Boolean
Return Me.objI.GetType() = iObj.GetType()
End Function
Function CompatibleType(ByVal iObj As I) As Boolean
Return Me.objI.GetType().IsAssignableFrom(iObj.GetType())
' Or this depending on which way round you want compatibility
' Return iObj.GetType().IsAssignableFrom(Me.objI.GetType())
End Function
请注意,这不是空安全的-如果您传入Nothing
或Me.objI
为Nothing,则调用GetType()
,您将得到NullReferenceException
,最后,对于一点,我似乎找到了解决方案:
Function SameTypeAs(ByVal iObj As I) As Boolean
Return CType(iObj, Object).GetType Is CType(Me.objI, Object).GetType()
End Function
或者通用的变体
Function SameTypeAs(Of T As I)() As Boolean
Return TypeOf Me.objI Is T
End Function
最后,对于a)点,我似乎找到了一个解决方案:
Function SameTypeAs(ByVal iObj As I) As Boolean
Return CType(iObj, Object).GetType Is CType(Me.objI, Object).GetType()
End Function
或者通用的变体
Function SameTypeAs(Of T As I)() As Boolean
Return TypeOf Me.objI Is T
End Function
至于b)…@serhio:对不起,我的意思是类型的。。。Is…
需要编译时类型。如果使用Return MyObj is t
,则只有当MyObj恰好是GetType(Type)
时才会返回true-它将MyObj
的值与类型t
进行比较,而不是MyObj
的值的类型@serhio:对不起,我的意思是TypeOf。。。Is…
需要编译时类型。如果使用Return MyObj is t
,则仅当MyObj恰好是GetType(Type)
时才会返回true-它将MyObj
的值与类型t
进行比较,而不是MyObj
的值的类型。问题是什么?“不起作用”不是很好的描述,问题是什么?“不起作用”并不是确切的描述,只是一个add:if而不是t作为类型where obj作为对象?@serhio:我看不出这有什么帮助。只是一个add:if而不是t作为类型where obj作为对象?@serhio:我看不出这有什么帮助。你为什么在这里使用CType?直接调用GetType就可以了。不,我想我需要使用DirectCast,因为它是运行时的最佳选择。直接获取类型我不能,因为接口。为什么在这里使用CType?直接调用GetType就可以了。不,我想我需要使用DirectCast,因为它是运行时的最佳选择。直接获取类型我不能,因为接口。