2011-04-23 11 views
5

Estoy tratando de usar un ExpandoObject como SelectedObject de un PropertyGrid. Sé cómo agregar las propiedades que quiero la ExpandoObject: trabajo¿Es posible agregar atributos a los miembros generados de una instancia de 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; 
} 

Este código de fino el depurador muestra los nombres y valores de propiedades expando 's como se esperaba.

Sin embargo, ninguna de las propiedades generadas se muestra en PropertyGrid cuando establezco el valor de retorno de MakePropertyObject() en su propiedad SelectedObject. Supongo (quizás falsamente) que esto se debe a que las propiedades de ExpandoObject no tienen ningún DisplayNameAttribute, DescriptionAttribute ni ninguno de los otros atributos utilizados para controlar cómo se muestran las propiedades en un PropertyGrid.

He hecho algunas lecturas y algo de Google, y no puedo averiguar si hay una forma de decorar las propiedades generadas de un ExpandoObject con atributos personalizados. ¿Alguien sabe cómo se puede hacer esto, o una mejor manera de mostrar un ExpandoObject en un PropertyGrid?

SOLUCIÓN:

La respuesta proporcionada por @Stephen Cleary era correcta y útil (gracias, Stephen). Para otros con el mismo problema, la implementación de ICustomTypeDescriptor funcionó perfectamente para mí.

Como nota al margen, el objeto que implementa ICustomTypeDescriptor proporciona los descriptores de propiedades y eventos por sí mismo, no para otro objeto. Pensé que se suponía que el descriptor y lo descrito estaban vinculados por un atributo o algo al principio; me parecía confuso y redundante que un objeto describiera su propio tipo, pero así es como PropertyGrid usa la interfaz ICustomTypeDescriptor.

Respuesta

6

El problema es que la reflexión no funciona como se esperaba en los tipos dinámicos.

PropertyGrid usa la reflexión para examinar las propiedades de su objeto, y ExpandoObject no tiene ninguna propiedad (estática).

Puede implementar ICustomTypeDescriptor para "secuestrar" el reflejo y consultar las propiedades (dinámicas) del ExpandoObject. El código para DynamicTypeDescriptorWrapper en this blog post sería un buen punto de partida.

Cuestiones relacionadas