Wie füge ich eine Methode zu einer Eigenschaft hinzu?

7

Nehmen wir an, ich erstelle eine Klasse mit einer Eigenschaft:

%Vor%

Was muss ich mit der Klasse und der Eigenschaft tun, um eine Methode an die UserID-Eigenschaft anhängen zu können, z. B. eine Methode, die Xml um die Benutzer-ID mit der "dot" -Syntax generiert:

%Vor%

Ich kann herausfinden, wie ich eine Methode schreiben kann, um Xml-Tags um den Wert der UserID zu legen, der Teil, der mir entgeht, ist, wie man die Methode mit der Eigenschaft unter Verwendung der "dot" -Syntax arbeiten lässt.

All diese Antworten sind nützlich, und danke an alle für ihren Beitrag. Tatsächlich war die Antwort, die ich als "akzeptiert" markierte, genau das, wonach ich suchte. Ich schätze die vorsichtigen Remakes auf Erweiterungsmethoden (von denen ich vorher noch nie gehört hatte), und natürlich könnte es ein Problem sein, die Extension-Methode unter bestimmten Umständen auf alle Strings anzuwenden, aber in diesem Fall wollte ich die Methode definitiv anwenden ToXml () für alle String-Eigenschaften in der Klasse. Genau das, was der Arzt bestellt hat. Ich bin ziemlich vertraut mit XmlSerialization, aber in diesem Fall benötigt, um es aus verschiedenen Gründen zu vermeiden.

    
Cyberherbalist 13.03.2009, 19:16
quelle

9 Antworten

5

Sie müssen die Methode zum -Typ der Eigenschaft hinzufügen. In diesem Fall ist die UserID eine Zeichenkette, was bedeutet, dass sie zum Stringtyp hinzugefügt wird und sie von all Zeichenketten zugänglich macht. Ich bin mir nicht sicher, ob das eine gute Idee ist, aber wenn du das wirklich willst, willst du:

%Vor%

Dies stimmt nicht genau mit der Funktionssignatur überein, aber es macht etwas Sinn, sich an die größere String-Klasse anzuhängen. Die einzige andere Option besteht darin, einen anderen zugrunde liegenden Typ zu verwenden, um Ihre Benutzer-ID zu speichern, möglicherweise eine benutzerdefinierte Klasse mit einer impliziten Konvertierung in eine Zeichenfolge.

Wenn Sie schließlich nur versuchen, Ihre Benutzerklasse generisch in Xml zu schreiben, sehen Sie sich den Namensraum System.Xml.Serialization an. Dann kannst du deine Klasse einfach so markieren und eine XmlSerializer -Instanz verwenden, um die Klasse zu lesen oder zu schreiben.

%Vor%     
Joel Coehoorn 13.03.2009, 19:21
quelle
13

Es gibt zwei Möglichkeiten:

Entweder das Objekt / der Wert, mit dem Sie arbeiten, muss diese Methode haben (z. B. wenn Sie die Objektdefinition kontrollieren).

%Vor%

Sie können auch eine Erweiterungsmethode (MSDN) für das Objekt implementieren. Geeks mit Blogs hat ein gutes Tutorial zu Erweiterungsmethoden und sie können auf .NET 2.0 angewendet werden, wenn Sie VS2008 ausführen.

%Vor%

Extension-Methoden sind etwas, das Sie stark belasten möchten, da eine Erweiterungsmethode auf ALL -Objekte dieses Klassentyps angewendet wird. (IE. Soll ich alle Zeichenfolgen können. ToXML ()?)

    
Gavin Miller 13.03.2009 19:19
quelle
7

Sie können entweder:

  1. Ändern Sie _userID in eine benutzerdefinierte Klasse, umschließen Sie eine Zeichenfolge und fügen Sie die gewünschten Methoden hinzu.
  2. Machen Sie eine Erweiterungsmethode für die String-Klasse (nicht empfohlen). Dies betrifft alle String-Objekte
Ben S 13.03.2009 19:20
quelle
2

Nun, die kurze Antwort ist, dass, obwohl es durch Erweiterungsmethoden möglich wäre, Sie dies nicht tun möchten. Es ist schlechte Form und nicht unbedingt was du willst.

Eine bessere Technik würde beinhalten, .NET XML-Serialisierung zu nutzen und Ihr Objekt zu übergeben. Es kann die XML-Magie für Sie tun.

    
Ken Wootton 13.03.2009 19:21
quelle
2

Sie haben im Wesentlichen mehrere Möglichkeiten, diese Aufgabe in C # 3.0 zu erledigen, einige direkter und ähnlicher, wie Sie es wollen, und einige weniger. Lassen Sie mich zuerst klären, warum es Ihnen wahrscheinlich nicht sofort klar ist, wie Sie so etwas erreichen können:

Da die Eigenschaft UserID vom Typ string ist (wie Sie angegeben haben), sind alle ihre Mitglieder definiert und somit auf die Mitglieder von String beschränkt (zumindest in der traditionellen objektorientierten Programmierung [OOP]). ). Dies beinhaltet natürlich auch Methoden. Sie scheinen eine ToXml -Methode hinzufügen zu wollen, was ohne Zugriff auf den Typ der Eigenschaft nicht möglich ist ( System.String in diesem Fall).

Ihre Optionen sind also wie folgt:

  1. Ändern Sie den Typ der Eigenschaft in eine benutzerdefinierte Klasse (d. h. eine UserIdentification -Klasse) und fügen Sie die Methode ToXml hinzu. In den meisten Fällen keine gute Lösung um ehrlich zu sein, da es unnötige Komplexität hinzufügt. Berücksichtigen Sie dies nur, wenn Sie mehrere Methoden / Eigenschaften hinzufügen müssen, die sich auf UserID beziehen.

  2. Fügen Sie einfach die ToXml -Methode zu Ihrer Benutzerklasse hinzu (und nennen Sie sie so etwas wie GetIdXmlString ). Eine anständige Lösung, und wahrscheinlich, was ich vor C # 3.0 gewählt hätte (und möglicherweise immer noch, abhängig von den Umständen).

  3. Erweiterungsmethoden . Dies ist ein großartiges Feature, das der neuesten Version von C # hinzugefügt wurde, mit der Sie vorhandene Klassen und Schnittstellen "erweitern" können, indem Sie ihnen Methoden hinzufügen, die mit einer speziellen Syntax definiert sind. Weitere Informationen finden Sie im verknüpften Artikel. Ihre Erweiterungsmethode sieht jedoch im Wesentlichen so aus:

    %Vor%

    Sie können diese Methode dann so aufrufen, als ob sie tatsächlich zur Klasse string gehört. Beachten Sie jedoch, dass diese letzte Methode möglicherweise nicht immer geeignet ist (da sie auf alle -Objekte vom Typ string in Ihrem Code angewendet werden kann). Wenn Sie eine generische ToXml-Funktion (mit Überladungen?) Schreiben möchten, die verschiedene Objekte in Ihr eigenes benutzerdefiniertes XML-Format konvertiert, dann ist das auch fair, ansonsten wäre es vielleicht besser, wenn Sie den zweiten Vorschlag verwenden. Eine Hilfsklasse ist eine weitere Alternative, und obwohl die Syntax etwas weniger schön ist, bedeutet es zumindest, dass die ToXml-Methode nicht für alle Zeichenfolgen angezeigt wird.

Hoffentlich hilft das ...

    
Noldorin 13.03.2009 19:29
quelle
0

Anstatt eine Zeichenfolge zu haben, müssen Sie eine Klasse haben, die ToXml ()

tatsächlich unterstützt     
Eric 13.03.2009 19:20
quelle
0

Nun, Sie würden das nicht mit einem String -Typ machen. Sie würden eine neue Klasse erstellen, die alle erforderlichen Methoden zur Zeichenfolgenverarbeitung enthält, aber auch die Methode "ToXml ()" implementiert hat. Leider können Sie nicht von der String-Klasse selbst ableiten, also müssen Sie Wrapper-Methoden oder eine andere Möglichkeit implementieren, um die String-Handling-Funktionalität zu liefern, die Sie auch wollen.

    
Mark Brittingham 13.03.2009 19:20
quelle
0

Ich nehme an, Sie könnten wirklich clever sein und eine Eigenschaft entfernen über AOP, die Eigenschaft durch eine Proxy-Klasse ersetzen, die die richtigen Methoden hatte. Aber selbst wenn Sie das tun würden, müssten Sie wahrscheinlich Ihre neue Eigenschaft auf eine Schnittstelle umwandeln - eine Doppelbesetzung, d. H.,

%Vor%

was wahrscheinlich den Punkt besiegen würde, es überhaupt zu tun. Aber hey - zumindest wirst du eine Trennung von Sorgen bekommen, richtig?

Im Ernst, ich würde mit den anderen, einfacheren Möglichkeiten gehen, die oben erwähnt wurden. Es sei denn, du willst ein AOP-Guru werden. :)

    
Dmitri Nesteruk 13.03.2009 20:05
quelle
0

Sie könnten einen Werttyp struct UserID erstellen, fügen Sie die Methode hinzu und verwenden Sie sie in Ihrer Klasse anstelle von string .

    
Tony the Pony 13.03.2009 20:33
quelle

Tags und Links