2009-12-03 2 views
1

Public MyObj как объектTypeOf является MyType

Public Function Test(t as Type) as Boolean 
Return TypeOf MyObj is t ' does not work 
End Function 

Спасибо.

* EDIT

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

Для ясности я буду использовать полный пример, немного модифицированный, который изначально считался.

Я использую интерфейс и хотел бы знать, являются ли объекты (реализация I), переданные в аргументе, тем же самым типом, что и внутреннее поле (I; A: I; AA: A; B: I).

Прежде всего, (а) мне нужно идентифицировать точный класс (только А = А, В = В, АА = АА) и я хотел бы также (б) иметь "наследование эквивалентности" (A = A и A = AA но <> 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 
+0

А в чем проблема ? «не работает» не совсем описательно – erikkallen

ответ

1

Наконец, для точки) Я, кажется, нашел решение:

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 

, как для б) ...

+1

Почему вы используете CType здесь? Просто вызвать GetType напрямую должно быть хорошо. –

+0

Нет, я думаю, мне нужно использовать DirectCast, потому что это оптимальное время исполнения. Непосредственно GetType я не могу, из-за интерфейса. – serhio

2

Вы могли бы просто сделать:

Return GetType(MyObj).Equals(t) 
+0

e ... почему ** Return MyObj is t ** не должен работать? – serhio

+0

@serhio: Поскольку «is» требует, чтобы время компиляции работало. –

+0

@ Однако этот код компилируется. – serhio

5

Вместо сравнения типов равенства, вы, вероятно, хотите использовать Type.IsAssignableFrom:

return t.IsAssignableFrom(MyObj.GetType()) 

Если вы посмотрите документацию на TypeOf ... Is ... оператора вы увидите, что он требует типа имени в качестве второго операнда. Это имя типа разрешено во время компиляции.

EDIT: Если вы действительно хотите точный равенство, то TypeOf ... Is ... не сработало бы для вас в любом случае.

Что касается разницы, рассмотрим:

MyObj = New MemoryStream() 

... 

Dim result = Test(GetType(Stream)) 

Хотите result быть истинным или ложным? Если вы хотите, чтобы это было ложными, вы должны использовать простое равенство:

return t is MyObj.GetType() 

Если вы хотите, чтобы быть правдой, потому что MyObj является назначения совместим с Stream, вы должны использовать код в верхней части этого ответа. Это было бы поведение TypeOf MyObject Is Stream, вот почему это был мой первоначальный ответ.

EDIT: Хорошо, отвечая на вопрос: измененное

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 нет ничего, вы получите NullReferenceException по вызову до GetType().

+0

В чем разница? – serhio

+0

Редактирование в этом случае ... –

+0

просто добавление: что, если вместо ** t как Type ** где * obj as Object *? – serhio