Erweiterungsmethode und explizites Casting

8

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?

    
Artur Keyan 29.11.2011, 06:08
quelle

4 Antworten

12

Sie können Operatoren nicht über Erweiterungsmethoden überladen.

Am besten können Sie mit einer Erweiterungsmethode machen:

%Vor%     
Christopher Currens 29.11.2011, 06:12
quelle
6

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:)

    
Jon Skeet 29.11.2011 06:18
quelle
2

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%     
Anthony Pegram 29.11.2011 06:12
quelle
0

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%     
Polity 29.11.2011 06:40
quelle