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

同じ変数型にキャスト

環境/言語:[VB2010を使っています。]
分類:[.NET]

VB2010を使っています。

変数Aと変数Bがあるとき、
変数Aの型を調べて、
変数Bを変数Aと同じ型にキャストするにはどうしたら良いのでしょうか。

    Public Shared Function ChangeValue(ByVal _itemValue As Object) As Object
        Dim title As String = "値の変更"
        Dim body As String = "新しい値を入力してください。"
        Dim newValue As String = InputBox(body, title, CType(_itemValue, String))

        Return CType(newValue, <ここで_itemValueと同じ型にキャストして返したい>)
    End Function



Type.GetTypeCodeやTypeNameなどで型をしらべても、
Ctypeの第二引数に入れるための型を作る方法がわかりません。
select文で以下のようにするのはさすがに違う気がします……

Select Case TypeName(_itemValue)
    Case "Integer"
        Return CType(_itemValue, Integer)
    Case "String"
        Return CType(_itemValue, String)
End Select
2011/10/19(Wed) 07:26:57 編集(投稿者)

■No29253に返信(ろいかえさんの記事)

Public Shared Function ChangeValue(of T)(ByVal _itemValue As T) As T

・・・

Return CType(Cobj(newValue), T)
End Function

こんなんでどう?
提示コードがなぜSharedなのかちょっと気になった。


#CObjを追加
■No29254に返信(shuさんの記事)

こんな書き方があったとは…

提示した関数がSharedなのは、Class CommonDialog内で宣言していて、
いろんなクラスで使いまわすことを想定しているからです。

教えていただいた方法を使って以下のように書き直しました。

    Public Shared Function ChangeValue(Of T)(ByVal _itemKind As String, ByVal _itemValue As T) As T
        Dim beforeValue As String = CType(CObj(_itemValue), String)
        Dim title As String = _itemKind & "の値を変更します。"
        Dim body As String = "新しい値を入力してください。" & vbNewLine & "以前の値 -> " & beforeValue
        Dim newValue = InputBox(body, title, beforeValue)
        If newValue = "" Then
            newValue = beforeValue
        End If
        Return CType(CObj(newValue), T)
    End Function

最初の(Of T)はジェネリッククラスというやつでしょうか。
CObj()関数は、オブジェクト型にキャストする関数ですね。
全く知らなかった記述法だったので、とても勉強になりました。
本当にありがとうございました。
解決済み!
  • 題名: Re[3]: 同じ変数型にキャスト
  • 著者: 魔界の仮面弁士
  • 日時: 2011/10/19 13:58:24
  • ID: 29258
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No29255に返信(ろいかえさんの記事)
> 最初の(Of T)はジェネリッククラスというやつでしょうか。
今回は、「Class クラス名(Of T)」ではなく
「Function メソッド名(Of T)」なので、
ジェネリックメソッドということになりますね。
解決済み!

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