[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#のサンプルをやっと見つけて書いたけれど、「よく考えたら別こんなことしなくても良いよね」と気づいてほったらかしたヤツです。