2016-12-08 1 views
-1

Wenn ich eine Methode, wie unten:Syntax Kette mehr Felder zusammen, die alle Teile des gleichen Rückgabeobjekts sind

public Person GetPerson(int id) 
{ 
    // code that returns a Person where id is == id 
} 

ist auch lassen, so dass Person wie folgt aussieht:

public class Person 
{ 
    public int id {get; set;} 
    public string firstName {get; set;} 
    public string lastName {get;set} 
} 

ich weiß, dass ich es wie so nennen könnte:

string name = GetPerson(someId).firstName; 

Was die Syntax ist, wo ich konnte c hain der firstName und lastName zusammen? Ich bin mir bewusst, dass einige der Antworten sein könnten, "nur ein Feld fullName erstellen", aber ich versuche gerade, meine Kenntnisse von C# zu erweitern, um zu sehen, ob es eine Möglichkeit gibt, diese Felder zusammen zu ketten OHNE dies tun:

string name = $"{GetPerson(someId).firstName} {GetPerson(someId).lastName}"; 

Ich möchte auch nicht das Person-Objekt zurückgeben und sie dann kombinieren. Ich möchte (wenn es möglich ist) einfach alles in einer Linie mit Verkettung kombinieren. Ich habe mehrere Möglichkeiten ausprobiert und kann es nicht kompilieren.

bearbeiten Was mich ursprünglich aufgefordert, zu wollen, dass diese die GetPerson Methode 2x Aufruf zu vermeiden, zu tun, als zu bekommen Sie den vollständigen Namen einer Verkettung Ansatz (wenn nicht nur eine Variable für diesen Zweck erstellen). Wie in den Kommentaren von Servy ausgeführt wurde, sind dies wirklich die Variablen, für die, wie O. R. Mapper ebenfalls anmerkte, das, wonach ich gesucht habe, von C# zur Zeit nicht unterstützt wird.

+2

Speichern Sie die Person in einer Variablen gezeigt nennen. Genau dafür gibt es sie. – Servy

+1

Was meinst du mit "Kette"? – Amy

+2

Warum fügen Sie dem Objekt, das die Zeichenfolgeninterpolation verwendet, einfach eine vollständige Namenseigenschaft hinzu oder 'string.Format', um dem vollständigen Namen beizutreten? – ColinM

Antwort

1

können Sie verwenden string.format

Person person = GetPerson(someId); 
string.Format("{0} {1}", person.firstName, person.lastName); 
+1

Jetzt bekommen Sie die Person zweimal statt einmal. Dies ist auch nicht wirklich anders als der OP-Code und hat alle die gleichen Probleme. – Servy

3

Nun, wenn Sie wirklich diese Linie in einem tun möchten, können Sie Erweiterungsmethode verwenden, die auf jedes Objekt anwenden wird, wie folgt aus:

public static class Extensions { 
    public static TResult Select<T, TResult>(this T target, Func<T, TResult> selector) { 
     return selector(target); 
    } 
} 

Und dann:

+0

Aber * deklariert explizit Variablen, die Variablen sind nur Parameter für eine Methode anstelle einer lokalen Variablen, aber sie sind beide Variablen. – Servy

+0

Aber Sie tun. 'p'. Es ist eine Variable vom Typ Person, die Sie deklariert haben. – Servy

+0

Nun sowieso Autor will nur Optionen zu erkunden, und das ist eine Option. Ich habe jedoch eine Notiz über explizite Variablen entfernt. – Evk

0

Wie ich verstehe OOD, was Sie meinen können Sie Eigentum auf Ihrer Person Klasse

string fullname 
{ 
    get 
    { 
     return firstName + " " + lastName; 
    } 
} 

machen, so wäre es:

GetPerson(someId).fullname; 
+1

Lesen Sie die Frage. – trashr0x

1

STart mit der Beantwortung der Frage: Wie würde die aneinander gekettet Vor- und Nachname des Programm verbrauchen?

Für den Anfang können Sie

  1. Erstellen Sie ein anderes Feld
string FullName 
{ 
    get 
     { 
     return this.firstName + " " + this.lastName; 
     } 
} 

Vorteile: Es ist nur lesbar und allein auf der Grundlage der Werte in der Klasse. Nachteile: Es ist ein anderes Feld und bewirkt, dass Sie die Single Responsibility Principle verletzen (was einen anderen Grund für die Änderung der Klasse bedeutet, in diesem Fall Formatierung gegenüber einem Datencontainer).

  1. eine eigene Klasse erstellen, die die Decorator Pattern implementiert, die dann das Aussehen (Formatierung) der Klasse Person, was auch immer Sie mögen ändern würde. Zum Beispiel:

    public interface IPersonFormatter 
    { 
         string asFullName();     // Returns "firstName lastName"; 
         string asCSVRecord();     // Returns "id,firstName,lastName" to be imported to Excel 
    } 
    
    public class ConcretePersonFormatter : IPersonFormatter 
    { 
         //Members 
         private Person _personInstance; 
    
         public ConcretePersonFormatter(Person p) 
         { 
           _personInstance = p; 
         } 
    
         //IPersonFormatter implementation 
         string asFullName() 
         { 
           return _personInstance.firstName + " " + _personInstance.lastName; 
         } 
    
         string asCSVRecord() 
         { 
           return _personInstance.id + "," + _personInstance.firstName + "," + _personInstance.lastName; 
         } 
    } 
    

Erstellen Sie dann eine ConcretePersonFormatter Instanz, und übergeben Sie Ihre Instanz von Person zu ihm, dann die oben genannten Methoden

Verwandte Themen