у меня есть аналогичный вопрос this one за исключение мне нужно цикл всех вложенных объектов и изменить свойство только для чтенияКак получить все свойства объекта и его вспомогательные объекты
Пожалуйста, проверьте мой код ниже. Этот один цикл является только основным объектом. Когда я попытался зациклировать свои подчиненные объекты, я получил переполнение.
Спасибо.
Public Class ReadOnlyTypeDescriptor
Inherits CustomTypeDescriptor
Private mComponent As Object
Public Sub New(ByVal component As Object)
MyBase.New(TypeDescriptor.GetProvider(component).GetTypeDescriptor(component))
mComponent = component
End Sub
Public Overloads Overrides Function GetProperties(ByVal attributes As Attribute()) As PropertyDescriptorCollection
Dim inPdc As PropertyDescriptorCollection = MyBase.GetProperties(attributes)
Dim pdcs As PropertyDescriptor() = New PropertyDescriptor(inPdc.Count - 1) {}
For i As Integer = 0 To pdcs.Length - 1
If inPdc(i).IsReadOnly Then
pdcs(i) = inPdc(i)
Else
pdcs(i) = New ReadOnlyPropertyDescriptor(inPdc(i))
End If
Next
Return New PropertyDescriptorCollection(pdcs, True)
End Function
Public Overloads Overrides Function GetProperties() As PropertyDescriptorCollection
Return GetProperties(Nothing)
End Function
Private Class ReadOnlyPropertyDescriptor
Inherits PropertyDescriptor
Private mParent As PropertyDescriptor
Public Sub New(ByVal parent As PropertyDescriptor)
MyBase.New(parent, New Attribute() {ReadOnlyAttribute.Yes})
mParent = parent
End Sub
Public Overloads Overrides Function CanResetValue(ByVal component As Object) As Boolean
Return False
' Read Only
End Function
Public Overloads Overrides ReadOnly Property ComponentType() As Type
Get
Return mParent.ComponentType
End Get
End Property
Public Overloads Overrides Function GetValue(ByVal component As Object) As Object
Return mParent.GetValue(component)
End Function
Public Overloads Overrides ReadOnly Property IsReadOnly() As Boolean
Get
Return True
End Get
End Property
Public Overloads Overrides ReadOnly Property PropertyType() As Type
Get
Return mParent.PropertyType
End Get
End Property
Public Overloads Overrides Sub ResetValue(ByVal component As Object)
' Read Only
End Sub
Public Overloads Overrides Sub SetValue(ByVal component As Object, ByVal value As Object)
' Read Only
End Sub
Public Overloads Overrides Function ShouldSerializeValue(ByVal component As Object) As Boolean
Return mParent.ShouldSerializeValue(component)
End Function
End Class
End Class