Como clase de entidad, quiero agregar atributos en tiempo de ejecución, ¿cómo debo hacer?C#: ¿Cómo agregar atributos a un objeto en tiempo de ejecución?
Respuesta
Editar: aclare, ¿está hablando de c# attributes o de miembros de su clase?
La única forma en que puede agregar atributos de C# es generar una clase completamente nueva con los atributos adicionales, compilar y cargar el nuevo ensamblado en su AppDomain existente.
Usa una tabla hash para almacenar tus atributos.
Si desea más flexibilidad de tiempo de ejecución, puede probar Ruby u otro lenguaje interpretado.
s/interpreted/dynamic /. Ruby, PHP y Python son dinámicos. C#, Java y VB son estáticos. – strager
@ bill Creo que se refiere al lenguaje dinámico ... –
Claro, buen punto. Se puede compilar cualquier idioma y se puede interpretar cualquier idioma. Es una extraña coincidencia que Ruby, PHP y Python se interpreten en general y se compilan C#, Java y VB ... –
Los atributos son parte de los metadatos de un tipo y, por lo tanto, están codificados en el ensamblado compilado (es por eso que solo se permite el uso de algunos tipos primitivos y no datos arbitrarios en los atributos).
La consecuencia es que no puede agregar ningún atributo a un tipo en tiempo de ejecución. Pero hay varias técnicas alternativas. Puede usar diccionarios simples o algo más poderoso como attached dependency properties.
Eche un vistazo al Dynamic Language Runtime. También podría considerar un lenguaje dinámico como IronRuby o IronPython.
¿Qué problama estás tratando de resolver?
lo que hay que ver los atributos? Si se trata de cosas como el enlace de datos, etc, TypeDescriptor
debería funcionar:
TypeDescriptor.AddAttributes(type, attribs);
TypeDescriptor.AddAttributes(instance, attribs);
Esto sólo afecta a System.ComponentModel
uso (reflexión no directa), pero que a menudo es suficiente - por ejemplo, se puede asociar una TypeConverter
a través de lo anterior.
Si con "atributos" quiere decir "propiedades", entonces (de nuevo, en lo que se refiere a la vinculación de datos) TypeDescriptor
también tiene potencial allí, pero no es trivial; necesita implementar ICustomTypeDescriptor
en el objeto, o escribir un CustomTypeDescriptor
para el tipo, y en cualquier caso, debe escribir su propia implementación PropertyDescriptor
(a menudo hablando con un diccionario por instancia, etc.). Esto se acostumbrará por cualquier cosa que utiliza:
// only works if you use TypeDescriptionProvider
PropertyDescriptorCollection typeProps = TypeDescriptor.GetProperties(type);
// works via TypeDescriptionProvider or ICustomTypeDescriptor
PropertyDescriptorCollection objProps = TypeDescriptor.GetProperties(obj);
Una vez más, esto cubre una amplia gama de escenarios de enlace de datos y similares. Para un ejemplo de esto, see here, está lejos de ser trivial, sin embargo. El ejemplo de uso (desde el enlace) añade dos propiedades en tiempo de ejecución:
Bag.AddProperty<int>("TestProp", new DefaultValueAttribute(5));
Bag.AddProperty<string>("Name");
Me gustaría ir con PostSharp, una muy elegante AOP framework (o Política de inyección).
PostSharp allows you to inject custom attributes.
La entrada del blog a la que se hace referencia en la publicación tiene algún código que puede descargar para lograr su objetivo.
Este post respondió por mí:
- 1. Agregar miembros a un objeto dinámico en tiempo de ejecución
- 2. Agregar atributos attr adicionales en tiempo de ejecución a un objeto activerecord
- 3. ¿Cómo se define un objeto C# en tiempo de ejecución?
- 4. ¿Cómo puedo agregar propiedades a un objeto en tiempo de ejecución?
- 5. ¿Cómo agregar margen a un botón en tiempo de ejecución?
- 6. Agregar imagen en tiempo de ejecución
- 7. Cómo agregar un UIButton en tiempo de ejecución
- 8. Agregar elementos a RibbonDropDown en tiempo de ejecución
- 9. Cómo agrego componentes a un JPanel en tiempo de ejecución
- 10. Agregar archivos a Java classpath en el tiempo de ejecución
- 11. agregando atributos a un objeto Ruby dinámicamente
- 12. Agregar atributos a un nodo XML
- 13. Tamaño de un objeto en tiempo de ejecución
- 14. Agregar dinámicamente miembros a un objeto dinámico
- 15. Cómo determinar la memoria de un objeto C++ en tiempo de ejecución
- 16. C# ¿Cómo generar un objeto implementando diferentes interfaces dinámicamente en tiempo de ejecución?
- 17. burlarse en tiempo de ejecución en C?
- 18. Agregar funciones en gdb en tiempo de ejecución
- 19. ¿Cómo agregar un control de botón a una vista xml de Android en tiempo de ejecución?
- 20. ¿Cómo usar layoutinflator para agregar vistas en tiempo de ejecución?
- 21. C# Pass genéricos en tiempo de ejecución
- 22. ¿Se puede hacer un objeto serializable en tiempo de ejecución?
- 23. Agregar DLL mediante programación en el tiempo de ejecución
- 24. Agregar tiempo al objeto POSIXct en R
- 25. Agregar Objeto C++ a Objective-Clase C
- 26. ¿Cómo agregar una vista dinámica a un elemento ListView en tiempo de ejecución?
- 27. ¿Es posible agregar ruta en tiempo de ejecución en MVC3?
- 28. C# Reflection: ¿Es posible encontrar una instancia de un objeto en tiempo de ejecución?
- 29. Cómo agregar atributos para la serialización de XML de C#
- 30. ¿Se puede forzar a un objeto java a implementar una interfaz en tiempo de ejecución?
Y por clase, que significa un tipo totalmente nuevo, no sólo otro ejemplo de la misma clase. –
@Joel tiene razón, puedo ver que podría ser un poco ambiguo. Gracias –