0

у меня есть аналогичный вопрос 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 

ответ

1

Если у вас есть объекты с круговыми ссылками, вы можете посетить объекты более одного раза.

В таких случаях я всегда нахожу способы «отмечать» те элементы, которые я посещал раньше, идея, которая обычно используется при пересечении графиков.

 Смежные вопросы

  • Нет связанных вопросов^_^