Ich habe eine c # -Klasse, die virtuelle Operationen zur Verfügung stellt. Für jede Operation existiert eine synchrone und eine asynchrone Version.
%Vor% Ich möchte, dass der Compiler eine Warnung anzeigt, wenn nur eine Version der Operation überschrieben wird (die synchrone oder die asynchrone Version der Operation), wie der Compiler warnt, wenn Equals
außer Kraft gesetzt wird, ohne GetHashCode
oder zu überschreiben und umgekehrt.
Im weiteren Sinne gefragt: Ist es möglich, zu erzwingen, dass das Überschreiben einer anderen Methode oder Eigenschaft das Überschreiben anderer Eigenschaften oder Methoden erzwingt (über Compilerwarnungen).
Obwohl dies keine Antwort auf Ihre eigentliche Frage ist, bitte ich um einen Ansatz, bei dem Sie die Warnung nicht einmal brauchen.
Warum erstellen Sie nicht eine abstrakte Klasse mit überschreibbaren Elementen und eine versiegelte ohne:
%Vor% Jetzt kann der Client entwerfen, wenn er eine Implementierung von Foo
mit Ihrem Standardverhalten (= DoNotImplementIt
) benötigt oder wenn er eine anpassbare Version benötigt, die ImplementIt
verwendet. Im ersteren Fall ist er gezwungen, die Mitglieder in letzterem Fall außer Kraft zu setzen.
Dieser Ansatz ist für Ihren API-Benutzer viel sauberer, da er weiß, was er aus der Vererbungskette entfernen muss, anstatt sich auf unordentliche Warnungen zu verlassen, um die sich niemand kümmert.
Ein noch besserer Ansatz wäre, Foo
als Schnittstelle zu definieren, die sowohl ImplementIt
als auch DoNotImplementIt
implementiert (klingt komisch, wie auch immer Sie es verstehen). Speichert Sie von diesem abstract override
. Auf diese Weise können Sie Ihre Schnittstelle auch von außen verbergen, indem Sie internal
setzen und die implementierenden Klassen nur über die API zugänglich machen.
Schreiben Sie Code, der die gleiche Wirkung wie die Durchsetzung hat.
Beispiel:
%Vor%Sie könnten einen benutzerdefinierten Code Analyzer schreiben. Ich habe es nie selbst benutzt. Wir haben FxCop benutzt und ein paar Regeln dafür geschrieben. Aber es ist ziemlich schwierig. Mit Roslyn sollte das viel einfacher sein.
Tags und Links c# compiler-warnings