5

ExpandoObject를 PropertyGrid의 SelectedObject로 사용하려고합니다. 나는 ExpandoObject에 내가 원하는 속성을 추가하는 방법을 알고 : 예상대로 디버거를 미세생성 된 ExpandoObject 인스턴스 구성원에 특성을 추가 할 수 있습니까?

public dynamic MakePropertyObject() 
{ 
    dynamic expando = new ExpandoObject(); 
    var dictionary = expando as IDictionary<string, object>; 
    foreach(MyClass m in PropertiesINeedToAdd) 
     dictionary[m.Name] = m.Value; 
    return expando; 
} 

이 코드의 작업은 expando의 속성의 이름과 값을 보여줍니다.

그러나 MakePropertyObject()의 반환 값을 SelectedObject 속성으로 설정하면 생성 된 속성 중 PropertyGrid에 아무 것도 나타나지 않습니다. 나는 ExpandoObject의 속성에 DisplayNameAttribute, DescriptionAttribute 또는 속성이 표시되는 방법을 제어하는 ​​데 사용되는 다른 속성이 PropertyGrid이 아니기 때문에 이것이 틀린 것 같다고 가정합니다.

몇 가지 독서와 일부 인터넷 검색을 수행했으며 ExpandoObject의 생성 된 속성을 맞춤 속성으로 장식하는 방법이 있는지 알 수 없습니다. 누구든지 이것이 완료 될 수있는 방법이나 ExpandoObjectPropertyGrid에 표시하는 더 좋은 방법을 알고 있습니까?

해결책 : @Stephen 클리어 리에서 제공

대답은 정확하고 도움이되었다 (감사, 스티븐). 동일한 문제가있는 다른 사람들을 위해 ICustomTypeDescriptor을 구현하면 완벽하게 작동합니다. ICustomTypeDescriptor 구현 측면 참고로

, 개체하지 다른 목적 위해, 자체의 속성 및 이벤트 기술자를 제공한다. 설명자와 설명이 처음에 속성이나 다른 것으로 연결되어야한다고 생각했습니다. 객체가 자체 유형을 설명해야한다는 것이 혼란스럽고 불필요한 것처럼 보였습니다. 실제로는 PropertyGridICustomTypeDescriptor 인터페이스를 사용하는 방법입니다.

답변

6

실제로 리플렉션이 동적 유형에서 예상대로 작동하지 않는 것이 문제입니다.

PropertyGrid은 리플렉션을 사용하여 개체의 속성을 검사하고 ExpandoObject에는 (정적) 속성이 없습니다.

ICustomTypeDescriptor을 구현하여 반사를 "도청"하고 ExpandoObject의 (동적) 속성을 쿼리 할 수 ​​있습니다. DynamicTypeDescriptorWrapper의 코드는 this blog post에 시작하는 것이 좋습니다.