首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeOf是myType

TypeOf是myType
EN

Stack Overflow用户
提问于 2009-12-03 10:25:12
回答 3查看 883关注 0票数 1

公共MyObj为对象

代码语言:javascript
复制
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)

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-03 12:23:13

最后,关于第一点,我似乎找到了一个解决办法:

代码语言:javascript
复制
  Function SameTypeAs(ByVal iObj As I) As Boolean
    Return CType(iObj, Object).GetType Is CType(Me.objI, Object).GetType()
  End Function

或者泛型变体

代码语言:javascript
复制
  Function SameTypeAs(Of T As I)() As Boolean
    Return TypeOf Me.objI Is T
  End Function

至于b)..。

票数 1
EN

Stack Overflow用户

发布于 2009-12-03 10:39:46

您可能希望使用Type.IsAssignableFrom,而不是比较类型是否相等。

代码语言:javascript
复制
return t.IsAssignableFrom(MyObj.GetType())

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

编辑:如果您真的想要完全相等,那么TypeOf ... Is ...无论如何也不会为您工作。

至于不同之处,请考虑:

代码语言:javascript
复制
MyObj = New MemoryStream()

...

Dim result = Test(GetType(Stream))

你希望result是真是假?如果您希望它是假的,您应该使用简单的等式:

代码语言:javascript
复制
return t is MyObj.GetType()

如果您希望它是真的,因为MyObj是与Stream兼容的赋值,那么您应该在这个答案的顶部使用代码。这就是TypeOf MyObject Is Stream的行为,这就是为什么这是我最初的回答。

编辑:好的,回答修改后的问题:

代码语言:javascript
复制
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

票数 5
EN

Stack Overflow用户

发布于 2009-12-03 10:32:26

你可以简单地做:

代码语言:javascript
复制
Return GetType(MyObj).Equals(t)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1839023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档