Gibt es in C # eine Möglichkeit, eine classnmethode mit einer Erweiterungsmethode zu überschreiben?

Es gab Gelegenheiten, wo ich eine Methode in einer class mit einer Erweiterungsmethode überschreiben möchte. Gibt es eine Möglichkeit, das in C # zu tun?

Beispielsweise:

public static class StringExtension { public static int GetHashCode(this string inStr) { return MyHash(inStr); } } 

Ein Fall, in dem ich dies tun wollte, ist in der Lage zu sein, einen Hash eines Strings in einer database zu speichern und denselben Wert von allen classn zu verwenden, die den Hash der String-class verwenden (zB Dictionary, etc.) Eingebauter .Net Hashing-Algorithmus ist nicht garantiert kompatibel von einer Version des Frameworks zum nächsten, ich möchte es durch mein eigenes ersetzen.

Es gibt noch andere Fälle, in denen ich eine classnmethode mit einer Erweiterungsmethode überschreiben möchte, damit sie nicht nur für die String-class oder die GetHashCode-Methode spezifisch ist.

Ich weiß, dass ich dies tun könnte, indem ich eine existierende class abzweige, aber es wäre praktisch, dies in vielen Fällen mit einer Erweiterung zu tun.

Nein; Eine Erweiterungsmethode hat niemals Vorrang vor einer Instanzmethode mit einer geeigneten Signatur und nimmt niemals am Polymorphismus teil ( GetHashCode ist eine virtual Methode).

Wenn die Methode eine andere Signatur hat, dann ist es möglich – also in Ihrem Fall: Nein.

Aber ansonsten müssen Sie inheritance verwenden, um das zu tun, wonach Sie suchen.

Soweit ich weiß, ist die Antwort nein, weil eine Erweiterungsmethode keine Instanz ist. Es ist mehr wie eine Intellisense-function für mich, mit der man eine statische Methode mit einer Instanz einer class aufrufen kann. Ich denke, eine Lösung für Ihr Problem kann ein Interceptor sein, der die Ausführung einer bestimmten Methode abfängt (zB GetHashCode ()) und etwas anderes tut. Um einen solchen Interceptor zu verwenden (wie das Castle Project), sollten alle Objekte instanziiert werden Objektfactory (oder ein IoC-Container in Castle), so dass ihre Interfaces über einen in Runtime generierten dynamischen Proxy abgefangen werden können (mit Caslte können Sie auch virtuelle Member von classn abfangen)