DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Type型を使った型の比較

環境/言語:[VB.NET 2010]
分類:[.NET]

こんにちは。
Type型変数との比較について教えてください。

type型の変数に入れた値に対して
キャスト可能かどうかを調べたいので次のコードを書きましたが
ビルドが通りません。
単純にビルドを通したいわけではなくて、type型変数に対して
それにキャスト可能かどうかを知りたいです。

    Class TestClassA
    End Class

    Class TestClassB
        Inherits TestClassA
    End Class

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button3.Click
        Dim typeValue As Type
        typeValue = GetType(TestClassA)

        If TypeOf (New TestClassB) Is typeValue Then
            MsgBox("OK")
        Else
            MsgBox("NOT OK")
        End If
    End Sub


TypeOf演算子は TypeOf オブジェクト Is 型 なら比較可能ですが
Type型との比較は許容していない様子です。

Type型変数を経由せずに
    If TypeOf (New TestClassB) Is TestClassA Then
このようにすればビルドも通りOKが出ることは確認していますが

今回はType変数を引数としている関数を作成しているので
直接の記述はしたくありません。


また、下記のように書くと
ビルドは通りますが、NOT OK になってしまいます。

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button3.Click
    Dim typeValue As Type
    typeValue = GetType(TestClassA)


    Dim TestB As New TestClassB

    If TestB.GetType Is typeValue Then
        MsgBox("OK")
    Else
        MsgBox("NOT OK")
    End If
End Sub


Type型変数を経由してあるオブジェクトの型に
キャスト可能かどうかということを調べるにはどのようにすれば
よろしいでしょうか?

ご存知の方おられましたら教えてください。
よろしくお願いします。
Type クラスの、IsAssignableFrom メソッドを使えば、継承関係またはインターフェイスについてはチェックできます。
// ユーザ定義型変換や VB 組み込みの型変換までフォローするのは大変そう。

実現したいことを見直せば、そもそも Type を使うことはないかもしれません。
2012/02/07(Tue) 16:53:10 編集(投稿者)
2012/02/07(Tue) 16:51:25 編集(投稿者)

■No29789に返信(FutoNekoさんの記事)

あっているか分かりませんが、こんな感じでどうででょう?

Public Class Form1
    Inherits Form

・・・

        Dim tpForm = GetType(Form)

        If tpForm.IsAssignableFrom(Me.GetType) Then
            Dim a As Form = Me
        End If

        Dim tpClass1 = GetType(Class1)
        If tpClass1.GetMethod("op_Implicit", New Type() {Me.GetType}) IsNot Nothing Then
            Dim b = CType(Me, Class1)
        End If

・・・
End Class


Class Class1
    Public Property Name As String

    Public Shared Narrowing Operator CType(obj1 As Form1) As Class1
        Return New Class1 With {.Name = obj1.Name}
    End Operator
End Class
自分で調べていて
If TestB.GetType.IsSubclassOf(typeValue) Then
で、私のやりたいことが実現できることが分かりました。


IsAssignableFrom だと、インターフェースなどもOKになるのですね。

Hongliangさん shuさん 素早く適切な回答ありがとうございます。
勉強になります。
■No29791に返信(shuさんの記事)

> If tpClass1.GetMethod("op_Implicit", New Type() {Me.GetType})
op_Explicitも探さないと駄目でした。そして提示した例はop_Explicitでした。

Narrowing=>元のオブジェクトの情報の1部しか保持しないCType。メソッド名ではop_Explicit

Widening=>元のオブジェクトの情報をすべて保持するCType。メソッド名ではop_Implicit

となります。

DOBON.NET | プログラミング道 | プログラミング掲示板