Я играю с идеей (никогда не играл с TypeDescriptors раньше), и мне удалось заставить ее работать хорошо.Но меня беспокоят некоторые решения "передовой практики", которые я принял во время своего небольшого эксперимента.
Я использую CustomTypeDescriptor, который получает событие от своих PropertyDescriptors, указывающее, что значения меняются или запрашиваются.
TypeDescriptorProvider генерирует совершенно новый экземпляр CustomTypeDescriptor каждый раз, когда вызывается GetTypeDescriptor, а затем связывает события в CustomTypeDescriptor с объектом экземпляра.
Я не уверен, будет ли генерировать новый CustomTypeDescriptor при каждом вызове GetTypeDescriptor, было бы хорошей идеей (даже если бы мне пришлось, чтобы это работало).Я также не уверен, есть ли какие-либо последствия с привязкой событий непосредственно из CustomTypeDescriptor к объекту экземпляра, особенно если CustomTypeDescriptor является динамическим.
Что вы, ребята, думаете?Пример кода моего провайдера ниже:
Class EntityTypeDescriptionProvider
Inherits TypeDescriptionProvider
Public Sub New(ByVal parent As TypeDescriptionProvider)
MyBase.New(parent)
End Sub
Protected Sub New()
End Sub
Public Overrides Function GetTypeDescriptor(ByVal objectType As Type, ByVal instance As Object) As ICustomTypeDescriptor
Dim _CustomTypeDescriptor As EntityTypeDescriptor
'Grabbin the base descriptor.
Dim Descriptor As ICustomTypeDescriptor = MyBase.GetTypeDescriptor(objectType, Nothing)
'If for...whatever reason the instance is empty, return the default descriptor for the type.
If instance Is Nothing Then
Return Descriptor
End If
'If the instance doesnt implement the interface I use for Descriptor customization
'(which should never happen) return the default descriptor for the type.
If Not Functions.IsImplemented(instance.GetType, GetType(ICustomTypeDescriptorEntity)) Then
Return Descriptor
End If
'
'
'some lengthy "customization" based on the state of the instance.
'
'
AddHandler _CustomTypeDescriptor.GetValue, AddressOf CType(instance, ICustomTypeDescriptorEntity).GetValue
AddHandler _CustomTypeDescriptor.SetValue, AddressOf CType(instance, ICustomTypeDescriptorEntity).SetValue
Return _CustomTypeDescriptor
End Function
End Class