我创建了一个用于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)
答案 0 :(得分:0)
在运行时更改ConverterTypeName
的唯一方法是尝试使用反射来访问私有字符串成员typeName
并将其设置为{{1}的AssemblyQualifiedName
}}
这是Type
内部构造函数的作用。