objetos - instanciar una clase c#
Exigir el atributo Decoración de clases/métodos (5)
Escribiría una unidad / prueba de integración que verifica que cualquier clase que coincida con algunos criterios dados (es decir, la subclase X) esté decorada de manera apropiada. Si configura su compilación para ejecutar con pruebas, puede hacer que la compilación falle cuando esta prueba falla.
ACTUALIZACIÓN: Dijo: "Parece que tendré que arremangarme y asegurarme de que las pruebas de la unidad se mantienen colectivamente", no es necesario. Simplemente escriba una clase de prueba general que use la reflexión para encontrar todas las clases que deben afirmarse. Algo como esto:
[TestClass]
public class When_type_inherits_MyObject
{
private readonly List<Type> _types = new List<Type>();
public When_type_inherits_MyObject()
{
// lets find all types that inherit from MyObject, directly or indirectly
foreach(Type type in typeof(MyObject).Assembly.GetTypes())
{
if(type.IsClass && typeof(MyObject).IsAssignableFrom(type))
{
_types.Add(type);
}
}
}
[TestMethod]
public void Properties_have_XmlElement_attribute
{
foreach(Type type in _types)
{
foreach(PropertyInfo property in type.GetProperties())
{
object[] attribs = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
Assert.IsTrue(attribs.Count > 0, "Missing XmlElementAttribute on property " + property.Name + " in type " + type.FullName);
}
}
}
}
A continuación de mi pregunta reciente sobre objetos grandes y complejos como un resultado del servicio web . He estado pensando cómo puedo asegurar que todas las clases futuras sean serializables a XML.
Ahora, obviamente, podría implementar la interfaz IXmlSerializable y luego lanzarle un lector / escritor, pero me gustaría evitar eso ya que significa que necesito crear una instancia de un lector / escritor cada vez que quiero hacerlo, y el 99.99% del tiempo. Voy a trabajar con una cadena para que pueda escribir la mía.
Sin embargo, para serializar a XML, simplemente estoy decorando la clase y sus miembros con el Xml ??? atributos ( XmlRoot , XmlElement etc.) y luego pasarlo a XmlSerializer y a StringWriter para obtener la cadena. Lo cual está todo bien. Tengo la intención de poner el método para devolver la cadena a un método de utilidad genérico, así que no tengo que preocuparme por el tipo, etc.
Lo que me preocupa es esto: si no decorar las clases con los atributos requeridos, no se lanzará un error hasta el tiempo de ejecución.
¿Hay alguna forma de imponer la decoración de atributos? ¿Se puede hacer esto con FxCop? (No he usado FxCop todavía)
ACTUALIZAR:
Perdón por la tardanza en cerrar esto, chicos, ¡hay mucho que hacer!
Definitivamente me gusta la idea de usar la reflexión para hacerlo en un caso de prueba en lugar de recurrir a FxCop (como para mantener todo en orden). La respuesta de Fredrik Kalseth fue fantástica, gracias por incluir el código, ya que probablemente me hubiera llevado un poco ¡para descubrir cómo hacerlo yo mismo!
+1 a los otros chicos por las sugerencias similares :)
Puede escribir pruebas unitarias para verificar este tipo de cosas, básicamente usa reflexión.
Dado el hecho de que esto es posible, supongo que también sería posible escribir una regla FxCop, pero nunca he hecho tal cosa.
Puede escribir una regla FxCop o incluso verificar los atributos llamando a GetType () en el constructor de la clase base y reflejando el tipo devuelto.
También puede usar este concepto / postprocesador para imponer relaciones entre atributos y usar un inicio de sesión similar para imponer relaciones entre clases y atributos en tiempo de compilación:
http://www.st.informatik.tu-darmstadt.de/database/publications/data/cepa-mezini-gpce04.pdf?id=92
Una buena regla de FXCop (y que estoy descubriendo que necesito en este momento) sería verificar que todos los objetos que se están agregando a la sesión de ASP.NET tengan el atributo Serializable. Estoy tratando de pasar del estado de la sesión de InProc a SQL Server. La primera vez que solicité una página, mi sitio explotó porque los objetos no serializables se estaban almacenando en Session. Luego vino la tarea de buscar en todo el código fuente buscando cada instancia en la que se establezca un objeto en la sesión ... FXCop sería una buena solución. Algo para trabajar en ...