Как изменить атрибут TypeConverter свойства во время выполнения? - PullRequest
1 голос
/ 20 декабря 2011

У меня есть класс, созданный для использования с элементом управления 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)

1 Ответ

0 голосов
/ 21 декабря 2011

Единственный способ изменить ConverterTypeName во время выполнения - попытаться использовать отражение для доступа к члену приватной строки typeName и установить для него значение AssemblyQualifiedName из Type.

Это то, что конструктор TypeConverterAttribute делает внутри.

...