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の文字の並びに依存するというデメリットもあるので、注意してほしい。
コメントを残す