2011-12-20 2 views
1

VB.Net 응용 프로그램에서 PropertyGrid 컨트롤과 함께 사용하도록 클래스를 만들었습니다. 클래스의 속성 중 하나는 :런타임에 속성의 TypeConverter 특성을 변경하는 방법은 무엇입니까?

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 변수는 '아무것도'없다 :

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가에있는 드롭 다운을 표시하는 데 사용됩니다 하나. 런타임에이 목록을 변경하고 싶습니다.

, η2 : (어떤 이유에 대한 대답을 삭제하기로 결정) 기여자의 관대 한 도움으로, 내 현재 위치를 내가 typeConv 변수에 필드를 얻을 수 없다는 것입니다,하지만 난 그것을 변경할 수 없습니다. GetType (propeList2)/GetType (propeList2) .AssemblyQualifiedName/a "제공하는 값에 관계없이 typeConv.SetValue 문에서 'System.RuntimeType'형식의 개체를 'System.String'형식으로 변환 할 수 없습니다. 임의의 문자열

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

아마도 [Convert.ChangeType] (http://msdn.microsoft.com/en-us/library/dtb69x08.aspx) 방법을 찾고 있을지 모르지만, 아마도 귀하의 요구 사항을 오해했습니다. –

+0

감사합니다. @TimSchmelter. 나는 그것이 후자라고 생각한다. 이 경우 TypeConverter는 PropertyGrid에 드롭 다운을 표시하는 데 사용되므로 사용자가 입력하는 대신 적절한 값을 선택할 수 있습니다. 런타임에이 목록을 변경하고 싶습니다. – Apeksha

답변

0

런타임에서 ConverterTypeName 민간 문자열 멤버 typeNameTypeAssemblyQualifiedName이 설정에 액세스하려면 반사를 사용하는 것입니다 변경할 수있는 유일한 방법입니다.

이것은 내부적으로 TypeConverterAttribute의 생성자가하는 것입니다.

+0

감사! 나는'typeConv.SetValue (attrib, GetType (propeList2) .AssemblyQualifiedName)'을 시도했다. 여기서 typeConv는'typeName' 필드이다. 그러나 그것은 오류를 던집니다. 내가 다르게해야 할까? – Apeksha

+0

예 : typeName 멤버 개체에서 SetValue를 호출하면 typeConv 유형에서 typeName 자체를 가져와야합니다 (private이므로 BindingFlags를 피들 필요가 있습니다). –

+0

미안하지만 이해가 안됩니다. (내 질문에 대한 두 번째 편집에서 지정한대로)'typeConv As System.Reflection.FieldInfo = attrib.GetType.GetField ("typeName", BindingFlags.Instance 또는 BindingFlags를 사용하여'typeConv'로'typeName' 필드를 검색했습니다. .Public 또는 BindingFlags.NonPublic 또는 BindingFlags.FlattenHierarchy)'를 참조하십시오. SetValue 문에 오류가 발생합니다. 'typeName' 필드의 값을 변경하는 올바른 방법인지 확실하지 않습니다. – Apeksha

관련 문제