如何在运行时更改属性的TypeConverter属性?

时间:2011-12-20 15:52:47

标签: vb.net reflection propertygrid

我创建了一个用于VB.Net应用程序中的PropertyGrid控件的类。该课程的一个属性是:

    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'的对象无法在typeConv.SetValue语句中转换为类型'System.String'”,而不管我提供的值 - 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 :(得分:0)

在运行时更改ConverterTypeName的唯一方法是尝试使用反射来访问私有字符串成员typeName并将其设置为{{1}的AssemblyQualifiedName }}

这是Type内部构造函数的作用。