【问题标题】:TypeOf is myTypeTypeOf 是 myType
【发布时间】:2010-12-22 18:43:45
【问题描述】:

作为对象的公共 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 and A=AA but AB

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

【问题讨论】:

  • 还有什么问题? “不起作用”不完全是描述性的

标签: .net vb.net typeof


【解决方案1】:

最后,对于 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)...

【讨论】:

  • 你为什么在这里使用CType?直接调用 GetType 就可以了。
  • 不,我想我需要使用 DirectCast,因为它是运行时最优的。直接GetType我不能,因为接口。
【解决方案2】:

您可能想使用Type.IsAssignableFrom,而不是比较类型是否相等:

return t.IsAssignableFrom(MyObj.GetType())

如果您查看TypeOf ... Is ... 运算符文档,您会发现它需要类型 name 作为第二个操作数。此类型名称在编译时解析。

编辑:如果你真的想要 exact 平等,那么 TypeOf ... Is ... 无论如何都不会为你工作。

至于区别,请考虑:

MyObj = New MemoryStream()

...

Dim result = Test(GetType(Stream))

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

return t is MyObj.GetType()

如果您希望它为真,因为MyObjStream分配兼容,您应该使用此答案顶部的代码。这就是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

请注意,这不是 null 安全的 - 如果您传入 Nothing 或如果 Me.objI 什么都不是,您将在调用 GetType() 时得到一个 NullReferenceException

【讨论】:

  • 只是一个补充:如果 t as Type where obj as Object 会怎样?
  • @serhio:我看不出这有什么帮助。
【解决方案3】:

你可以这样做:

Return GetType(MyObj).Equals(t)

【讨论】:

  • @serhio:对不起,我的意思是TypeOf ... Is ... 需要编译时类型。如果您使用Return MyObj is t,如果 MyObj 恰好是 GetType(Type),则 返回 true - 它会将 MyObjtype进行比较> t,而不是MyObj的值的类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多