GetPropertyを使用した値のセットとゲット

前提

サブクラスや構造体の値を、サブクラス.プロパティで値の参照更新するのではなく、直接データの参照更新を行いたい。

方法

仮に下記のようなClassがあったとする

Class Fields 

    Public field1 As String
    Public field2 As String
    Public field3 As String

End Class

通常であれば、
Fields.field1=”A”
Fields.field2=”B”

のように設定していくが、同じようなフィールドが増えるほど単純なバグを抱えるリスクも上がる。
できれば見えているリスクは回避したい。本来であれば、こういった構造自体を回避すべきだと思うが、やむを得ないシーンは多々ある。

そんな時に便利なのがGetProperty
使い方はいたって簡単で、

GetType(構造体).GetProperty(フィールド名).GetValue(値が入った構造体)

とすればよい。

実例

    '_fieldを事前に宣言しておく
    _field = New Fields With
                {
                    .field1 = "A",
                    .field2 = "B",
                    .field3 = "C"
                }

    '値を取得する方法
    Console.WriteLine("初期値:" & GetType(Fields).GetProperty("field1").GetValue(_field))

    '値を設定する
    GetType(Fields).GetProperty("field1").SetValue(_field, "AAA")
    Console.WriteLine("更新1:" & GetType(Fields).GetProperty("field1").GetValue(_field))

実行結果
A
AAA

応用1 Foreachを使用したゲット

    '応用1 単純なゲット
    Dim count As Integer = 1
    For Each item As PropertyInfo In _field.GetType.GetProperties
        '値を取得する
        Console.WriteLine("flag" & count.ToString & ":" & item.GetValue(_field))
        count += 1
    Next

実行結果
A
B
C

応用2 Foreachを使用したセット

    '単純なセット
    count = 1
    For Each item As PropertyInfo In _field.GetType.GetProperties

        Select Case count
            Case 1
                item.SetValue(_field, "A1")
            Case 2
                item.SetValue(_field, "B1")
            Case 3
                item.SetValue(_field, "C1")
        End Select

        '値を取得する
        Console.WriteLine("flag" & count.ToString & ":" & item.GetValue(_field))
        count += 1
    Next

実行結果
A1
B1
C1

応用3 GetPropertiesを使用する

    'カンマ区切りの値をそのままセット
    Dim csv As String() = {"A2", "B2", "C2"}
    count = 0
    For Each item As PropertyInfo In _field.GetType.GetProperties
        item.SetValue(_field, csv(count))
        '値を取得する
        Console.WriteLine("flag" & (count + 1).ToString & ":" & item.GetValue(_field))
        count += 1
    Next

実行結果
A2
B2
C2

まとめ

応用3をうまく活用すると、単純なCSV取り込みではフィールドに一つ一つ値を詰め込んでいくといった無駄なコードを排除できる。ただし、csvの文字の並びに依存するというデメリットもあるので、注意してほしい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です