Wie kann ich eine gemeinsame Erweiterungsmethode auf mehrere nicht verwandte Typen in einem SDK eines Drittanbieters anwenden?

8

Ich fange an, mich in Erweiterungsmethoden zu verlieben, aber ich weiß einfach nicht, wie man eine EM nur für einen bestimmten Objekttyp erstellt.

Ich habe zum Beispiel:

%Vor%

Mein Problem ist, dass ich diese Methode auch im Person-Objekt haben möchte, und deshalb habe ich

genannt %Vor%

Gibt es eine Möglichkeit, AddPhoneNumber zu haben und mit dem bereitgestellten Objekt umzugehen?

oder die Lösung soll

haben %Vor%

Danke.

    
balexandre 05.02.2009, 10:23
quelle

5 Antworten

11

Wie wäre es mit dem Schreiben von zwei Erweiterungsmethoden:

%Vor%

und

%Vor%

Sieht für mich sauberer aus.

Wenn es einen gemeinsamen Code zwischen den beiden gibt, extrahieren Sie diesen in eine separate Methode.

    
Frederick The Fool 05.02.2009, 10:31
quelle
7

Machen Sie Contact und Person eine gemeinsame Schnittstelle implementieren - sagen wir IContactWithPhoneNumbers - und schreiben Sie dann eine Erweiterungsmethode "für diese Schnittstelle".

%Vor%     
Anton Gogolev 05.02.2009 10:27
quelle
1

Lesen Sie Ihre Kommentare (Objekte stammen von einem SDK und sind nicht editierbar). Ich würde wahrscheinlich so etwas tun:

%Vor%

Ich denke jedoch, dass die beste Vorgehensweise, wenn Sie die Kontrolle über die zugrunde liegenden Objekte haben, darin besteht, eine gemeinsame Schnittstelle zu implementieren.

    
Eric Schoonover 05.02.2009 10:37
quelle
0

Sie könnten Ihre Erweiterungsmethode generisch machen, z. B .:

%Vor%

Sie können lock nicht verwenden, da "'T' kein Referenztyp ist, wie er von der lock -Anweisung benötigt wird", so dass Sie möglicherweise einen Wert zurückgeben müssen.

Wenn es sich darüber beschwert, dass die Phones-Methode auf Typ T nicht aufgelöst werden kann, könnten Sie:

Übergeben Sie einige Funktionsdelegaten , die den Typ T annehmen, nichts zurückgeben und die Aktion ((T)contact).Phones.Add(pr); .

Oder Sie könnten eine Schnittstelle wie die folgende erstellen:

%Vor%

Sobald Sie diese Schnittstelle haben, können Sie Ihrer generischen Erweiterungsmethode Folgendes hinzufügen:

%Vor%

Hier ist T immer noch ein generischer Typ, aber jetzt hat Ihre AddPhoneNumberToContact-Methode die Anforderung, dass, egal was T ist, sie von der IPonable-Schnittstelle erbt, die Sie soeben mit der Phones () -Methode definiert haben / p>

Siehe auch C # -Erweiterungsmethode für generische Sammlungen .

    
Sarah Vessels 02.07.2009 16:44
quelle
0

Wenn Sie Person und Kontakt nicht ändern können, können Sie eine Unterklasse von ihnen erstellen und sie die gemeinsame Schnittstelle implementieren lassen.

In der Erweiterungsmethode deklarieren Sie die allgemeine Schnittstelle als Parameter:

%Vor%     
Thomas 08.06.2017 09:49
quelle

Tags und Links