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.
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.
Machen Sie Contact
und Person
eine gemeinsame Schnittstelle implementieren - sagen wir IContactWithPhoneNumbers
- und schreiben Sie dann eine Erweiterungsmethode "für diese Schnittstelle".
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.
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 .
Tags und Links c# extension-methods