Frage

OK, das ist sozusagen eine Fortsetzung von meine vorherige Frage.

Was ich wirklich gerne tun würde, ist eine Art Attribut zu erstellen, das es mir ermöglicht, eine Methode zu dekorieren, die dies tut brechen Sie den Build.Ähnlich wie die Veraltet("Grund", wahr) Attribut, ohne jedoch veralteten Code fälschlicherweise zu identifizieren.

Um klarzustellen:Ich möchte nicht, dass es den Aufbau zerstört BELIEBIG F6 (Build) drücken, ich möchte nur, dass der Build unterbrochen wird, wenn eine mit dem Attribut dekorierte Methode an einer anderen Stelle im Code aufgerufen wird.Wie ich sagte, ähnlich veraltet, aber nicht dasselbe.

Ich weiß, dass ich seitdem nicht allein damit bin andere Benutzer möchten es aus anderen Gründen verwenden.Ich habe noch nie zuvor benutzerdefinierte Attribute erstellt, daher ist das alles neu für mich!

War es hilfreich?

Lösung

Wenn dies für XML-Serialisierung und NHibernate gilt und Sie möchten, dass auf den parameterlosen Konstruktor zugegriffen werden kann (wie es in der Fall ist). Beispiel Sie haben darauf verwiesen), und verwenden Sie dann einen privaten oder geschützten Konstruktor ohne Parameter für die Serialisierung oder einen geschützten Konstruktor für NHibernate.Mit der geschützten Version eröffnen Sie die Möglichkeit, dass geerbte Klassen diesen Code aufrufen können.

Wenn Sie nicht möchten, dass Code eine Methode aufruft, machen Sie sie nicht zugänglich.

BEARBEITEN:Um vielleicht die tiefere Frage zu beantworten: AFAIK, der Compiler kennt nur drei Attribute: Veraltet, bedingt und AttributeUsage.Um eine spezielle Behandlung für andere Attribute hinzuzufügen, müsste der Compiler geändert werden.

Andere Tipps

Ich denke, das wäre eine hervorragende Funktionsanfrage für Microsoft:Erstellen Sie ein abstraktes Basisklassenattribut CompilerExecutedAttribute die der Compiler in irgendeiner Weise verarbeitet oder die den Kompilierungsprozess beeinflussen können.Dann könnten wir von diesem Attribut erben und verschiedene Operationen implementieren, z.B.einen Fehler oder eine Warnung ausgeben.

Wenn Sie eine Warnung (die von [Veraltet] ausgegeben wird) als Build-Brechen erachten, verwenden Sie einfach die #Warnung Compiler-Direktive.

Bearbeiten:Ich habe es noch nie benutzt, aber #Fehler ist auch vorhanden.

Ich denke, der einzig narrensichere Weg wäre, Visual Studio (über VSIP) zu erweitern und die richtige Ereignisklasse (vielleicht in der EnvDTE.BuildEvents)-Klasse zu abonnieren, Ihren Code auf die Verwendung des Konstruktors zu überprüfen und den Build gegebenenfalls abzubrechen es erkennen.

Das hört sich alles ein bisschen so an Das TDWTF von gestern. :-)

Ich muss Greg zustimmen:Erstelle ein Attribut dafür.

Und wenn Sie es wirklich ernst meinen, finden Sie vielleicht eine Möglichkeit herauszufinden, ob auf den Konstruktor von etwas anderem als XMLSerializer zugegriffen wird, und lösen Sie gegebenenfalls eine Ausnahme aus.

Ich würde Ihnen empfehlen, die #error-Direktive zu verwenden.

Ein weiteres ziemlich unbekanntes Attribut, das die Arbeit erledigen könnte, ist das bedingtes Attribut (je nachdem, was Sie erreichen möchten)

[Conditional("CONDITION")] 
public static void MiMethod(int a, string msg)

Dadurch wird der Methodenaufruf aus dem IL-Code selbst entfernt, wenn „MY_CONDITION“ definiert ist.

Erstellen Sie eine FxCop-Regel und fügen Sie FxCop zu Ihrem Integrations-Build hinzu, um dies zu überprüfen.

Sie erhalten Warnungen statt eines fehlgeschlagenen Builds.Attribute werden zur Reflexionszeit und nicht zur Buildzeit ausgeführt.

Alternativ (und das ist ziemlich unangenehm) können Sie eine Compiler-Direktive um die Methode setzen, die nicht aufgerufen werden soll.Dann wird Ihr Code kaputt gehen, wenn Sie ihn aufrufen, aber Sie können einen Build einrichten, der die richtige Compiler-Direktive übergibt und nicht.

Lösen Sie als Post-Build-Schritt eine benutzerdefinierte Ausnahme und einen Komponententest dafür aus

Antwort 4 Jahre später :)

Ich hatte die gleiche Frage, ob es eine Alternative zu Obsolete gäbe.

Soweit ich mich erinnere (Channel9-Videos), hat Microsoft vor einiger Zeit erklärt, dass es daran arbeitet, Entwicklern irgendwann Zugriff auf so etwas wie eine Compiler-API zu geben, sodass es denkbar ist, dass man in Zukunft ein Compiler-„Plugin“ schreiben könnte, das dies ermöglichen würde um Methoden mit Ihrem eigenen benutzerdefinierten Attribut zu dekorieren und den Compiler anzuweisen, abzubrechen, wenn es so aussieht, als ob der dekorierte Code an einer anderen Stelle im Code usw. aufgerufen werden könnte.

Was eigentlich ziemlich cool wäre, wenn man darüber nachdenkt.Es erinnert mich auch daran, dass ich auch versuchen sollte, mich über den Fortschritt der Compiler-API zu informieren, an der MS arbeitet ...

Warum nicht einfach etwas erfinden?Ein unbekanntes Attribut würde den Build sicherlich zerstören.

[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top