2013-06-08 9 views
12

Ist es möglich, ReSharper zu verwenden, um nützlichen aber bloody Code mit ReSharper auszugrauen? Wenn ich beispielsweise eine ausführliche Protokollierung hinzufügen möchte, ist es sinnvoll, den Funktionscode um den Protokollierungscode hervorzuheben.Gray out Protokollierungscode mit ReSharper

Ich habe versucht, ReSharper-Musterkatalogsuche zu verwenden, um Muster in meinem Code zu vergleichen und sie in grau hervorzuheben, aber es unterstützt nur Hinweise, Vorschläge, Warnungen und Fehler.

Ich bin auf der Suche nach etwas ähnlich wie Debug.WriteLine im Release-Modus angezeigt wird, obwohl ich nicht Code kompiliert werden möchte.

+3

Dieser Hack :)) ist eine interessante Idee. Sie könnten es auf ihrem Problem Tracker vorschlagen: http://youtrack.jetbrains.com/issues/RSRP –

+0

Es wurde hier vorgeschlagen: https://youtrack.jetbrains.com/issue/RSRP-437773 –

Antwort

-3

Tun Sie es einfach nicht.

Es ist ein schlechter Weg, unstrukturierten Code zu bewältigen, und es wird nur ein wenig hilfreich sein, und nur für Sie. Wenn Sie es so machen, wie Sie es vorschlagen (wenn möglich), müssen andere Entwickler ReSharper installieren und es wie Sie konfigurieren, wenn sie die Geschäftslogik hervorheben wollen.

Das ist nicht das, was Sie gefragt haben, aber ich denke, ein besserer Ansatz besteht darin, die ausführliche Protokollierung in separate Methoden/Klassen zu verschieben. Dann wäre protokollierungsbezogener Code nur ein einziger Methodenaufruf in Ihren aktuellen Methoden.

+1

Sie können nicht bewegen aller weltlichen Code (wie Protokollierung oder Überprüfung), um Methoden zu trennen, ist es in der Regel mit logisch hart interlaced. –

9

Sie können dies erreichen, aber es ist eine Art Hack. Was Sie tun könnten, ist dekorieren Sie Ihre Logging-Methoden mit der ConditionalAttribute, mit ReSharper External Annotations. fast überall

Anmerkungen werden in ReSharper verwendet, es ist, wie es die Debug.WriteLine Linie in Release, zum Beispiel zu graut weiß, da die Debug.Write... Linien mit [Conditional("DEBUG")]-Attribut versehen sind.

Was könnten Sie tun, ist betrügen, indem sie ReSharper denken, dass eine solche bedingte Methode auf dem Logger Methoden existiert. Sie können dies tun, indem Sie dieses Attribut extern über XML anwenden.

Ich schrieb über in my blog so etwas wie dies zu tun, ist hier, wie Sie dies tun könnte:

  1. eine Datei YourLogger.ExternalAnnotations.xml, zum Beispiel genannt erstellen NLog.ExternalAnnotations.xml und platzieren Sie es neben Ihrer Logger-Assembly.
  2. Fügen Sie den folgenden:
<assembly name="NLog"> 
    <member name="M:NLog.Logger.Info(System.String)"> 
    <attribute ctor="M:System.Diagnostics.ConditionalAttribute.#ctor(System.String)"> 
     <argument>LOG</argument> 
    </attribute> 
    </member> 
    <member name="M:NLog.Logger.Debug(System.String)"> 
    <attribute ctor="M:System.Diagnostics.ConditionalAttribute.#ctor(System.String)"> 
     <argument>LOG</argument> 
    </attribute> 
    </member> 
</assembly> 

Sie Für jede Methode wollen "ausgegraut", müssen Sie mit dem XML-Doc-ID Name der Methode ein <member> Block hinzuzufügen. In ReSharper 8 EAP gibt es eine Option Kopiere XML-Doc ID in die Zwischenablage, unter ReSharper Edit Menü.

Dies bewirkt im Wesentlichen, dass ReSharper-Engine denkt, dass ein [Conditional("LOG")] in den Metadaten des Logger-Typs definiert ist.

Nachdem Sie alle gewünschten Methoden hinzugefügt haben, laden Sie die Lösung einfach neu. Sie sollten bekommen, was Sie suchen (Art von ...wie ich schon sagte, es

ReSharper hackery

+0

Ich empfehle dies nicht sehr, da Aufrufe, die durch das Attribut '[Conditional]' gelöscht wurden, Auswirkungen auf das C# -Compiler-Kontrollflussdiagramm und die Analyse definierter Zuweisungen sowie auf die Codeanalyse von R # haben. ReSharper ignoriert alle nützlichen Informationen über Ausdrücke, die im Rahmen von '[Conditional]' - Aufrufen ausgewertet werden. Das ist "zu viel", um den Code einfach zu ergrauen. Besser schreibe ein Plugin :) – ControlFlow

+1

@ControlFlow Ich sollte wahrscheinlich "nicht versuchen, dies zu Hause" Haftungsausschluss :) –