2

Ich weiß was ConditionalAttribute tut.Was bewirkt ConditionalAttribute für ein Attribut?

Die docs sagen, es kann auch zu einer Klasse angewendet werden, wenn es von Attribute abgeleitet ist:

[Conditional("DEBUG")] 
public class FooAttribute : Attribute { } 

Aber wie das benutzerdefinierte Attribut verhalten? (Ist es aus einem Release-Build entfernt?)

+0

Es gibt eine andere Frage über: http://StackOverflow.com/a/1412838/4730201 –

+0

@RicardoPontual Nein, das das Problem nicht behandelt. Ich möchte wissen, was es tut, wenn es speziell auf ein "Attribut" angewendet wird. –

+0

[Anwenden von ConditionalAttribute auf ein Attribut gibt an, dass das Attribut nicht an Metadaten ausgegeben werden soll, wenn das Symbol für bedingte Kompilierung nicht definiert ist.] (Http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute (v = vs.110) .aspx) Was bedeutet das? –

Antwort

2

@ RicardoPontual Kommentar gab mir eine Idee.

Ich tat dies:

[Conditional("DEBUG")] 
public class FooAttribute : Attribute { } 

[Foo] 
public class Bar { } 

I in Debug-Modus kompiliert und geladen, um die DLL in ILSpy (es ist ein Disassembler). Das ist, was ich gefunden, wie erwartet:

[Foo] 
public class Bar { } 

Dann habe ich in Release-Modus kompiliert und geladen, dass die DLL in ILSpy. Dies ist, was ich gefunden habe:

public class Bar { } 

Die Bar Klasse wurde diesmal nicht eingerichtet!

Also, die Antwort ist, dass, wenn Sie einige benutzerdefinierte Attribute mit Conditional dekorieren, dann wird das Attribut selbst auf die gleiche Weise bedingt.

Das ist das Verhalten, das ich wollte. Ich dachte ursprünglich, von ConditionalAttribute abzuleiten, aber es ist versiegelt. Stattdessen müssen Sie Ihr benutzerdefiniertes Attribut dekorieren.

+1

Großartig, der Test beantwortet die Frage. Ich könnte mir einige nützliche Dinge vorstellen, wie zum Beispiel eine Logik in der Laufzeit implementieren, je nachdem, ob die Assembly kompiliert Debug oder Release war, nur das Vorhandensein eines benutzerdefinierten Attributs überprüfen: 'if (typeof (MyType) .IsDefined (typeof (MyCustomAttribute), false)) ' –

Verwandte Themen