VB2005でInterface.GetType()をするには

解決


58  2011-05-06 22:15:57  No: 147316

自宅PCでVB2010 Expressを使用して書いたコードを、
会社PCのVB2005 Professionalで編集したりするのですが、
その際、VB2010ではコンパイル出来たコードがVB2005ではコンパイルできない事があります。
それで困ったのが以下のような場合です。

---------------- 以下ソースコード ----------------

Public Interface ISample

  '何らかの処理
End Interface

Public Class Sample_01
  Implements ISample
  
  '何らかの処理
End Class

Public Class Sample_02
  Implements ISample
  
  '何らかの処理
End Class

Public Class Test

  Public Sub ShowType(Sample As ISample)
  
    'ここで、VB2005の場合のみコンパイルエラー
    MsgBox(Sample.GetType().ToString)
  End Sub
End Class

Public Class Form1
  
  Private Sub Button1_Click()
  
    Dim Test As New Test
    
    Test.ShowType(New Sample_01)
    Test.ShowType(New Sample_02)
  End Sub
End Class

---------------- 以上ソースコード ----------------

全てのクラスは、「System.Object」から派生するので、全ての変数
においてGetType()する事が出来るはずなのですが、VB2005の場合、
Interface型の変数よりGetType()出来ません。これと同じ処理を実現
するにはどうすればよろしいでしょうか。ご存知の方がいらっしゃいましたら、助言を頂けると幸いです。


魔界の仮面弁士  2011-05-07 01:50:24  No: 147317

> Public Interface ISample
>     '何らかの処理
> End Interface
インターフェイス内に「処理」を定義できましたっけ?

> これと同じ処理を実現するにはどうすればよろしいでしょうか。

(案1)
Public Class Test
    Public Sub ShowType(Of T)(ByVal Sample As T)
        MsgBox(GetType(T).ToString())
    End Sub
End Class

(案2)
Public Class Test
    Public Sub ShowType(ByVal Sample As ISample)
        MsgBox(CObj(Sample).GetType().ToString())
    End Sub
End Class


魔界の仮面弁士  2011-05-07 02:00:22  No: 147318

(案2改)
Public Class Test
    Public Sub ShowType(Of T As ISample)(ByVal Sample As T)
        MsgBox(Sample.GetType().ToString())
    End Sub
End Class

(案3) (無理矢理)
Public Class Test
    Public Sub ShowType(ByVal Sample As ISample)
        MsgBox(CallByName(Sample, "GetType", CallType.Get).ToString())
    End Sub
End Class


58  2011-05-08 04:13:26  No: 147319

御世話になります。

>インターフェイス内に「処理」を定義できましたっけ?
ちょっとした「あや」です。すみません。
プロパティやメソッド等の「シグネチャ」の定義ですね。

なるほど。ジェネリックタイプを使うという手がありましたか。
毎度ながら、貴重なサンプルありがとうございます。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加