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
.