En otras palabras, podría ser posible crear un ensamblado, que ni siquiera compila (suponiendo que el código de comprobación no se elimine) si cada uno de las clases no tienen ("deben tener") atributos personalizados (por ejemplo, autor y versión)?¿Es posible consultar Atributos personalizados en C# durante el tiempo de compilación (no en tiempo de ejecución)
Este es el código que he utilizado para realizar consultas en tiempo de ejecución:
using System;
using System.Reflection;
using System.Collections.Generic;
namespace ForceMetaAttributes
{
[System.AttributeUsage (System.AttributeTargets.Method, AllowMultiple = true)]
class TodoAttribute : System.Attribute
{
public TodoAttribute (string message)
{
Message = message;
}
public readonly string Message;
}
[System.AttributeUsage (System.AttributeTargets.Class |
System.AttributeTargets.Struct, AllowMultiple = true)]
public class AttributeClass : System.Attribute
{
public string Description { get; set; }
public string MusHaveVersion { get; set; }
public AttributeClass (string description, string mustHaveVersion)
{
Description = description;
MusHaveVersion = mustHaveVersion ;
}
} //eof class
[AttributeClass("AuthorName" , "1.0.0")]
class ClassToDescribe
{
[Todo (" A todo message ")]
static void Method()
{ }
} //eof class
//how to get this one to fail on compile
class AnotherClassToDescribe
{
} //eof class
class QueryApp
{
public static void Main()
{
Type type = typeof(ClassToDescribe);
AttributeClass objAttributeClass;
//Querying Class Attributes
foreach (Attribute attr in type.GetCustomAttributes(true))
{
objAttributeClass = attr as AttributeClass;
if (null != objAttributeClass)
{
Console.WriteLine("Description of AnyClass:\n{0}",
objAttributeClass.Description);
}
}
//Querying Class-Method Attributes
foreach(MethodInfo method in type.GetMethods())
{
foreach (Attribute attr in method.GetCustomAttributes(true))
{
objAttributeClass = attr as AttributeClass;
if (null != objAttributeClass)
{
Console.WriteLine("Description of {0}:\n{1}",
method.Name,
objAttributeClass.Description);
}
}
}
//Querying Class-Field (only public) Attributes
foreach(FieldInfo field in type.GetFields())
{
foreach (Attribute attr in field.GetCustomAttributes(true))
{
objAttributeClass= attr as AttributeClass;
if (null != objAttributeClass)
{
Console.WriteLine("Description of {0}:\n{1}",
field.Name,objAttributeClass.Description);
}
}
}
Console.WriteLine ("hit Enter to exit ");
Console.ReadLine();
} //eof Main
} //eof class
} //eof namespace
//uncomment to check whether it works with external namespace
//namespace TestNamespace {
// class Class1 { }
// class Class2 { }
//}
Editar: Sólo para justificar mi elección para la respuesta. Creo que CasperOne brindó la respuesta correcta a la pregunta.
Sin embargo, las razones para hacer la pregunta parecían ser weak. Probablemente debería comenzar a utilizar alguna herramienta externa, como: FinalBuilder o crear pruebas de control de cada uno para este "requisito", usando Pex, Nunit u otros marcos de pruebas unitarias ...
EDITAR he añadido una pequeña code snippet de un programa de consola al final de las respuestas que realiza el control ... no dude en comentar, criticar o sugerir mejoras
Una vez más me di cuenta de que este "requisito" debe implementarse como parte de la unidad de pruebas justo antes del "check in"
Thaks para responder! ¿Qué quiere decir más específicamente con "Lo que intenta hacer no es un buen sustituto para un control de tiempo de ejecución adecuado"? –
@YordanGeorgiev: incluso si tiene un proceso de compilación que asegura que se aplica el atributo, TODAVÍA debe verificar su código de tiempo de ejecución para asegurarse de que se aplica el atributo. No puede dejar de verificar allí porque cree que lo atrapó en tiempo de compilación. – casperOne
Por lo tanto, el requisito para obtener al menos 4 atributos "must have" afectará el rendimiento, debido a la reflexión ... Parece que realizar las comprobaciones en las pruebas unitarias será una mejor idea. –