Ich verwende eine Klasse aus einer Assembly (Quellcode ist nicht verfügbar), daher ist es nicht möglich, ihren Code zu ändern Ich muss eine Erweiterungsmethode für den expliziten Darsteller hinzufügen, gibt es eine Möglichkeit, dies zu erreichen? (Ich habe versucht, als normale Erweiterungsmethode hinzuzufügen, aber ohne Erfolg)
%Vor%Wie kann ich das lösen?
Sie können Operatoren nicht über Erweiterungsmethoden überladen.
Am besten können Sie mit einer Erweiterungsmethode machen:
%Vor%Wie andere bereits gesagt haben, können Sie Operatoren mit Erweiterungsmethoden nicht überladen - aber eine einfache Erweiterungsmethode wäre immer noch nützlich:
%Vor%Dann benutze es einfach als:
%Vor%Ich persönlich finde das klarer als eine explizite Konvertierung - ich gehe sehr selten auf eine Überlastung des Operators ein. Insbesondere angesichts der Tatsache, dass die Klassen sicherlich klingen sind, könnte ein naive Benutzer diesen Code erwarten:
%Vor% ... ist eine normale Referenzkonvertierung und erwartet, dass MembershipUser
eine Klasse ist, die von User
abgeleitet ist. Dies ist wichtig in Bezug auf die Objektidentität - wenn dies der Fall wäre, würde es das betroffene Objekt nicht ändern (und Änderungen an dem Objekt, auf das sich user
bezieht, wären weiterhin über% co_de sichtbar %).
Durch das Erstellen einer membershipUser
-Methode wird deutlicher, dass Sie von einem Formular in ein neues Objekt des anderen Typs konvertieren. Alle IMO, natürlich:)
Nein, Sie können keine Erweiterungskonvertierung hinzufügen.
Explizite oder implizite Konvertierungen können nur definiert werden, wenn Sie den Quellcode für einen der beteiligten Typen steuern. In Ihrem Fall können Sie entweder MembershipUser
oder User
steuern, Sie müssen beide nicht steuern. Aber du musst einen steuern.
Wenn Sie keine Kontrolle haben, müssen Sie einfach die Konvertierung in einer Methode einer anderen Klasse definieren, deren Aufgabe es ist, eine solche Konvertierung zu steuern.
%Vor%Nicht zu sagen, dass dies eine gute Übung ist (lies andere Antworten, warum du das nicht willst, aber wenn die Klassen nicht versiegelt sind, ist das möglich, verwende keine Erweiterungsmethoden).
Grundsätzlich können Sie eine Ersatzklasse erstellen, die den Benutzer erbt, der den Casting-Operator definiert, etwa so:
%Vor%Tags und Links .net c# casting extension-methods explicit-conversion