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)
您可能希望使用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().
| 归档时间: |
|
| 查看次数: |
874 次 |
| 最近记录: |