У меня есть класс, созданный для использования с элементом управления PropertyGrid в приложении VB.Net. Одно из свойств класса:
Private _someProp As String
<Browsable(True), _
BindableAttribute(False), _
DesignOnly(False), _
DescriptionAttribute("Some Property Description"), _
TypeConverter(GetType(propList1)), _
DisplayName("Some Property")> _
Public Property someProp() As String
Get
Return _someProp
End Get
Set(ByVal Value As String)
_someProp = Value
End Set
End Property
Я хочу изменить атрибут TypeConverter этого свойства во время выполнения . В настоящее время я изменяю другие атрибуты (например, только для чтения, для просмотра), например:
Dim descriptor As PropertyDescriptor = TypeDescriptor.GetProperties(Me.GetType)("someProp")
Dim attrib_r As ReadOnlyAttribute = descriptor.Attributes(GetType(ReadOnlyAttribute))
Dim isReadOnly As System.Reflection.FieldInfo = attrib_r.GetType.GetField("isReadOnly", Reflection.BindingFlags.NonPublic + Reflection.BindingFlags.Instance)
isReadOnly.SetValue(attrib_r, True)
Однако я не могу применить подобную технику для изменения атрибута TypeConverter. Когда я пытаюсь это сделать, переменная typeConv 'Nothing':
Dim descriptor As PropertyDescriptor = TypeDescriptor.GetProperties(Me.GetType)("someProp")
Dim attrib As TypeConverterAttribute = descriptor.Attributes(GetType(TypeConverterAttribute))
Dim typeConv As System.Reflection.FieldInfo = attrib.GetType.GetField("typeConverter", Reflection.BindingFlags.NonPublic + Reflection.BindingFlags.Instance)
typeConv.SetValue(attrib, IIf(someCondition, GetType(propList1), GetType(propList2)))
ETA: TypeConverter в этом случае используется для отображения раскрывающегося списка в PropertyGrid, так что пользователи могут выбрать подходящее значение вместо ввода одного. Я хочу изменить этот список во время выполнения.
ETA2: С щедрой помощью участника (который по какой-то причине решил удалить ответ) моя текущая позиция заключается в том, что я получаю поле в переменной typeConv, но не могу его изменить. Я получаю сообщение об ошибке «Объект типа« System.RuntimeType »не может быть преобразован в тип« System.String »в операторе typeConv.SetValue независимо от предоставленного мной значения - GetType (propeList2) / GetType (propeList2) .AssemblyQualifiedName / a случайная строка
Dim typeConv As System.Reflection.FieldInfo = attrib.GetType.GetField("typeName", BindingFlags.Instance Or _
BindingFlags.Public Or _
BindingFlags.NonPublic Or _
BindingFlags.FlattenHierarchy)
typeConv.SetValue(attrib, value)