|
■No89233 (魚魚 さん) に返信 > Public Class TextColorClass > Property ZZZ As New TextColorClass2 > End Class
これだと外部から xxx.ZZZ = Nohing のように差し替えられてしまうので、ZZZ は ReadOnly Property にしておいた方が良いのでは。
> クラスの中のPropertyをFor Eachなどで回すことはできないでしょうか?
呼び出し側で列挙するより、一括代入のために xxx.Reset(Color.Black) のように呼び出せるメソッドを TextColorClass 自身に持たせるのはどうでしょう。
以下サンプル。リフレクションを用いているので、パフォーマンスは犠牲になります。 (速度を求める場合は、そもそも最初から Dictionary 等で管理した方が良いでしょう)
Public Class TextColorClass Property AAA As Color Property BBB As Color Property CCC As Color Property DDD As Color Property ZZZ As New TextColorClass2
''' <summary> ''' このクラスが持つすべての「Color を返すプロパティ」に値を代入します。 ''' </summary> ''' <param name="c">代入する値。</param> Public Sub Reset(c As Color) Reset(Me, c) End Sub Private Sub Reset(o As Object, c As Color, Optional recurseDepth As Integer = 1) If o Is Nothing Then Return Dim properteis = o.GetType().GetProperties() 'As Color な引数無しプロパティを列挙して、新しい色を代入する。 For Each p In From q In properteis Where q.PropertyType Is GetType(Color) AndAlso q.CanWrite AndAlso q.GetSetMethod().GetParameters().Length = 1 p.SetValue(o, c) Next If recurseDepth > 0 Then 'As Color 以外を返す引数無しプロパティがあれば再帰的に処理する For Each p In From q In properteis Where q.PropertyType IsNot GetType(Color) AndAlso q.CanRead AndAlso q.GetGetMethod().GetParameters().Length = 0 Select q.GetValue(o) Reset(p, c, recurseDepth - 1) Next End If End Sub
End Class
|