[VB.NET] クラスをDictionaryに変換する

クラスをDictionaryに変換するサンプル

クラスをDictionary(Of String, Object)に変換するサンプルです。

main()で作成しているテスト用の「record」クラスは、
・ src ┳ item1
・ ・ ┣ item2
・ ・ ┣ item3
・ ・ ┣ item4
・ ・ ┗ item5 ┳ param1
・ ・ ・ ・ ・ ┣ param2
・ ・ ・ ・ ・ ┗ param3
という構造にしてあります。
クラスの中にプリミティブ型のプロパティしか持たない場合の方が稀だと思うので、階層にしてみました。
これをDictionaryに変換します。

以下はコード

Module Module1

    ''' <summary>
    ''' メイン
    ''' </summary>
    Sub main()

        '変換テスト用のクラスを作成
        Dim src As New record
        src.item1 = "テスト"
        src.item2 = 123
        src.item3 = New DateTime(2021, 1, 1)
        src.item4 = True
        src.item5 = New record_param With {.param1 = "パラメータ", .param2 = 456, .param3 = New DateTime(2021, 1, 2)}

        'クラスをDictionaryに変換する
        Dim rec As New Dictionary(Of String, Object)
        rec = ModelToDictionary(src)

        Console.WriteLine(rec("item1"))
        Console.WriteLine(rec("item2"))
        Console.WriteLine(rec("item3"))
        Console.WriteLine(rec("item4"))
        Console.WriteLine(rec("item5")("param1"))
        Console.WriteLine(rec("item5")("param2"))
        Console.WriteLine(rec("item5")("param3"))
    End Sub

    ''' <summary>
    ''' クラスをディクショナリに変換する
    ''' </summary>
    ''' <param name="src"></param>
    ''' <returns></returns>
    Public Function ModelToDictionary(ByVal src As Object) As Dictionary(Of String, Object)
        Dim result As New Dictionary(Of String, Object)
        Dim val As Object
        For Each pi As ComponentModel.PropertyDescriptor In ComponentModel.TypeDescriptor.GetProperties(src)
            Type.GetTypeFromCLSID(pi.PropertyType.GUID)
            val = pi.GetValue(src)
            If GetType(IComparable).IsAssignableFrom(pi.PropertyType) OrElse pi.PropertyType.IsPrimitive OrElse pi.PropertyType.IsValueType Then
                result.Add(pi.Name, val)
            Else
                'Valueがプリミティブ型以外なら再帰呼び出し
                result.Add(pi.Name, ModelToDictionary(val))
            End If
        Next
        Return result
    End Function
End Module

''' <summary>
''' レコードクラス
''' </summary>
Public Class record
    Public Property item1 As String
    Public Property item2 As Integer
    Public Property item3 As DateTime
    Public Property item4 As Boolean

    ''' <summary>
    ''' レコードパラメータークラス
    ''' </summary>
    ''' <returns></returns>
    Public Property item5 As record_param
End Class

''' <summary>
''' レコードパラメータークラス
''' </summary>
Public Class record_param
    Public Property param1 As String
    Public Property param2 As Integer
    Public Property param3 As DateTime

End Class

何をやりたくてこれを調べたのか忘れたのですが、ふと思い出してサンプルを探したら残ってました。
プリミティブ型の判定をどうしたらいいのか色々調べて、どこかのサイトでC#のサンプルをやっと見つけて書いたけれど、「よく考えたら別こんなことしなくても良いよね」と気づいてほったらかしたヤツです。

VB.NETVB.NET

Posted by itblogks