TypeOf是myType

ser*_*hio 1 .net vb.net typeof

公共MyObj作为对象

Public Function Test(t as Type) as Boolean
 Return TypeOf MyObj is t ' does not work
End Function
Run Code Online (Sandbox Code Playgroud)

谢谢.

*编辑

================================================== ==================

为了清楚起见,我将使用一个完整的例子,最初被认为是一点修改.

我使用一个接口,并想知道参数中传递的对象(实现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
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

您可能希望使用Type.IsAssignableFrom以下内容而不是比较类型的相等性:

return t.IsAssignableFrom(MyObj.GetType())
Run Code Online (Sandbox Code Playgroud)

如果查看TypeOf ... Is ...操作员文档,您将看到它需要类型名称作为第二个操作数.此类型名称在编译时解析.

编辑:如果你真的想要完全平等,那么TypeOf ... Is ...无论如何都不会对你有用.

至于差异,请考虑:

MyObj = New MemoryStream()

...

Dim result = Test(GetType(Stream))
Run Code Online (Sandbox Code Playgroud)

你想result成真还是假?如果你想要它是假的,你应该使用简单的相等:

return t is MyObj.GetType()
Run Code Online (Sandbox Code Playgroud)

如果你希望它是真实的,因为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
Run Code Online (Sandbox Code Playgroud)

请注意,这不是空的安全 - 如果你传入Nothing或者Me.objI什么都没有,你将NullReferenceException接到一个电话GetType().