Mit anderen Worten könnte es möglich sein, Assembly zu erstellen, die nicht einmal kompiliert (vorausgesetzt, der Prüfcode wird nicht entfernt) Die Klassen haben keine benutzerdefinierten Attribute (zum Beispiel "Autor" und "Version").Ist es möglich, benutzerdefinierte Attribute in C# während der Kompilierzeit abzufragen (keine Laufzeit)
Hier ist der Code, den ich während der Laufzeit verwendet haben, für die Abfrage: meine Wahl zu rechtfertigen, Just for Antwort:
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 { }
//}
bearbeiten. Ich denke, CasperOne lieferte die richtige Antwort auf die Frage.
Die Gründe für das Stellen der Frage schienen jedoch weak zu sein. Wahrscheinlich sollte ich beginnen, einige externe Tool zu verwenden, wie zum Beispiel: FinalBuilder oder Unit-Tests schaffen für diese „Anforderung“ Überprüfung, mit Pex, Nunit oder eine andere Einheit Test-Frameworks ...
EDIT Ich habe eine kleine code snippet eines Konsolenprogramms am Ende der Antworten, die die Prüfung durchführt ... fühlen Sie sich frei, zu kommentieren, zu kritisieren oder Verbesserungen vorzuschlagen
Noch einmal wurde mir klar, dass diese "Anforderung" als Teil der Unit-Tests kurz vor der Implementierung implementiert werden sollte "Einchecken"
Thaks für die Beantwortung! Was meinen Sie genauer mit "Was Sie zu tun versuchen, ist kein guter Ersatz für eine ordnungsgemäße Laufzeitprüfung."? –
@YordanGeorgiev: Selbst wenn Sie einen Build-Prozess haben, der sicherstellt, dass das Attribut angewendet wird, sollten Sie noch immer Ihren Laufzeitcode einchecken, um sicherzustellen, dass das Attribut angewendet wird. Sie können nicht aufhören, dort nachzusehen, weil Sie denken, Sie hätten es zur Kompilierzeit abgefangen. – casperOne
Also die Anforderung für mindestens 4 "Muss haben" Attribute wird die Leistung beeinflussen, wegen der Reflexion ... Scheint, die Durchführung der Prüfungen in Unit Tests wird als bessere Idee sein?! –