Recientemente leí sobre atributos y reflexión y pensé que sería un buen método para incluir metadatos en mi programa. Tengo esta clase abstracta y quería que todas las clases heredaran de ella para declarar con la clase algún atributo, ya que quería que se crearan componentes personalizados (esas clases derivadas) para mi programa y quería leer los metadatos de estas clases en tiempo de ejecución. Sin embargo, todas las clases derivadas deben declarar explícitamente el atributo en el que almaceno los metadatos. Entonces, ¿cómo forzar una declaración de atributo en las clases derivadas? Gracias.Declaración de atributo de fuerza en clases derivadas
Respuesta
Defina su clase de atributo para que tenga un atributo AttributeUsageAttribute
donde la propiedad Inherited
es .
o no hacer, ya que es el valor por defecto ...
objetivos derivados (es decir, las clases si el atributo está en una clase, métodos si es en un método, etc.) entonces heredar el atributo sin declaración explícita.
Si por "fuerza", quiere decir "compilar el cumplimiento del tiempo": No puede.
Como dijo Daniel, no puede aplicar atributos en tiempo de compilación.
Pero si quiere leer los datos en tiempo de ejecución, ¿para qué preocuparse por los atributos y la reflexión? Puede crear un método abstracto en su clase abstracta:
abstract class Base
{
public abstract string Metadata();
}
class Derived1 : Base
{
public override string Metadata()
{
return "Metadata for Derived1";
}
}
class Derived2 : Base // won't compile, since Metadata has not been provided
{
}
El comportamiento es ligeramente diferente, por supuesto. Con esta opción, necesita una referencia a una instancia de la clase derivada en lugar de solo la información del tipo en sí. Por otro lado, evita la reflexión.
Como dice Daniel, no se puede forzar en tiempo de compilación. Puede agregar los atributos al padre abstracto y recogerlos.
Otra opción es agregar un método para verificar la existencia del atributo en la clase principal y lanzar una excepción si no está presente. Llama eso desde métodos adecuados.
- 1. enumeración de las clases derivadas
- 2. ¿Múltiples clases abstractas derivadas?
- 3. ¿Se prohíbe automáticamente la copia en clases derivadas de clases derivadas de Boost noncopyable?
- 4. Herencia múltiple de dos clases derivadas
- 5. contraints genéricas en las clases derivadas
- 6. ¿Configurar en clases derivadas con NUnit?
- 7. Simpler "Prevenir clases derivadas" en C++
- 8. C++ Boost serialización La serialización de clases derivadas de plantilla
- 9. ¿Cómo saber todas las clases derivadas de un padre?
- 10. Uso de la fuerza del atributo personalizado
- 11. Levantar eventos de clase base en clases derivadas C#
- 12. WCF DataContract Excluir DataMembers de Ser serializados en clases derivadas
- 13. Implementando la implementación de eventos en clases abstractas derivadas
- 14. C# comportamiento foreach con clases derivadas?
- 15. Usando XmlSerializer para serializar clases derivadas
- 16. ¿Las clases derivadas se consideran amigos?
- 17. constructor de copia de base y clases derivadas
- 18. Anulando constantes en las clases derivadas en C#
- 19. Anulando miembros estáticos en clases derivadas en PHP
- 20. declaración adelantada de clases en Python
- 21. Herramienta para fusionar clases de C# base y derivadas
- 22. ¿Cómo serializar las clases de plantilla derivadas con Boost.serialize?
- 23. TypeID para las clases derivadas de una clase base común
- 24. AutoMapper no funciona con la colección de clases derivadas
- 25. C++ plantilla de fundición con las clases derivadas
- 26. Entity Framework no consulta las clases derivadas - Error en DbOfTypeExpression
- 27. Cómo llamar a métodos anulado en todas las clases derivadas
- 28. Campos estáticos en una clase base y clases derivadas
- 29. ¿El Is.EqualTo de NUnit no funciona de manera confiable para las clases derivadas de clases genéricas?
- 30. Ignorar propiedades en las clases derivadas al usar XmlSerializer de .NET
¡increíble! Gracias. – irisjay