eric101 Posted December 18, 2008 Posted December 18, 2008 Hi, I need to wrap a class and change its attributes to readonly during run-time. My class has primitive datatype properties and a lot of properties with class datatype. I have a code sampe that wrap "partially" of the class properties. So far, all of the datatypes could be wrap except for class datatype. Thanks so much Dim cloneObj as New DeepCloneObject(MyObject) Dim ro as New ReadOnlyTypeDescriptor(cloneObj) PropertyGrid1.SelectedObject = ro --------------------------------------------------------------------------------------------------------- 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 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.