公共MyObj为对象
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),我也希望(b)具有“继承等价性”(A=A和A=AA,但A<>B)
Option Strict On
Option Explicit On
Public Class Form1
' object to test
Private objI As I
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim aObj As New A
Dim aaObj As New AA
Dim bObj As New B
'assing the object to test - A
Me.objI = New A
'test it
MessageBox.Show(SameTypeAs(aObj).ToString()) ' need True here
MessageBox.Show(SameTypeAs(bObj).ToString()) ' need False here
MessageBox.Show(SameTypeAs(aaObj).ToString()) ' need a)Flase and b)True here
End Sub
Function SameTypeAs(ByVal iObj As I) As Boolean
' here is the "problem":
' how to detect the same (sub)types of I?
Return Me.objI Is iObj
End Function
' interface..........
Interface I
End Interface
' class A..........
Class A
Implements I
End Class
' class B..........
Class B
Implements I
End Class
' class AA..........
Class AA
Inherits A
End Class
End Class发布于 2009-12-03 12:23:13
最后,关于第一点,我似乎找到了一个解决办法:
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)..。
发布于 2009-12-03 10:39:46
您可能希望使用Type.IsAssignableFrom,而不是比较类型是否相等。
return t.IsAssignableFrom(MyObj.GetType())如果您查看TypeOf ... Is ...操作符文档,您将看到它需要一个类型名作为第二个操作数。此类型名称在编译时解析.
编辑:如果您真的想要完全相等,那么TypeOf ... Is ...无论如何也不会为您工作。
至于不同之处,请考虑:
MyObj = New MemoryStream()
...
Dim result = Test(GetType(Stream))你希望result是真是假?如果您希望它是假的,您应该使用简单的等式:
return t is MyObj.GetType()如果您希望它是真的,因为MyObj是与Stream兼容的赋值,那么您应该在这个答案的顶部使用代码。这就是TypeOf 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为空,则在调用GetType()时将得到一个NullReferenceException。
发布于 2009-12-03 10:32:26
你可以简单地做:
Return GetType(MyObj).Equals(t)https://stackoverflow.com/questions/1839023
复制相似问题