2009-03-09 10 views
1

Ich habe eine Methode bekommt, die derzeit eine IList als Parameter übernimmt, wo UserBO des folgenden ähnelt:Wie mache ich diese Klasse wiederverwendbarer? (Spezifisches Beispiel innen)

public class UserBO { 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public string Pin { get; set; } 
} 

public class SomeClass { 
    // An example method giving the basic idea of what I need to do 
    public void WriteUsers(IList<UserBO> users) { 
     // Do stuff with users 
     for (var user in users) { 
      Console.WriteLine(String.Format(User: {0}: {1}, users.Username, Hash(users.Pin)); // Now needs to optionally be users.Password 
     } 
    } 

    private string Hash(string pin) { 
     return // Hashed Pin 
    } 
} 

Diese Methode verwendet dann die Username/Pin-Paare einige XML zu erstellen verwendet von einem anderen Programm (wir verwenden die obige Methode als Beispiel).

Die Sache ist, jetzt muss ich in der Lage sein, den gleichen Code zu erzeugen, außer die Verwendung des Passwort-Feldes anstelle des Pin-Feldes (es gibt einen guten Grund, beide Felder zu haben).

Anstatt nur eine andere Methode mit einem ähnlichen Namen zu erstellen, würde ich den Code lieber umgestalten, um den BO-spezifischen Code vollständig aus dieser Klasse zu entfernen und die Entscheidung darüber zu treffen, welche Klasse/Mitglieder verwendet werden sollen werden nicht in der Methode selbst gemacht, sondern im Code, der sie aufruft.

Eine Option wäre, ein IDictionary zu übergeben und die Linq ToDictionary-Methode zu verwenden, um ein Wörterbuch im aufrufenden Code zu erstellen. Dies würde jedoch die Reihenfolge der Gegenstände verlieren (was schön, aber nicht unbedingt notwendig wäre). Ich könnte eine IList oder etwas verwenden, aber das wäre schwieriger zu konvertieren die IList.

Hat jemand gute Vorschläge, wie man das macht?

P.S. Wenn jemand eine bessere Vorstellung davon hat, wie man diesen Beitrag tituliert, dann zögern Sie nicht, es zu versuchen.

Antwort

2

Sie können auch Ausdrücke verwenden:

WriteUsers(IList<T> users, u => u.Username, u => u.Password); 

wenn Sie mit Net 3.5.

+0

Ich denke, das könnte funktionieren. Ich werde es testen. Vielen Dank! –

2

Es ist nicht klar genau was Sie nach der Formatierung mit den Strings tun müssen. Sie könnte das Verfahren machen eine IEnumerable<string> nehmen und dann den anrufenden Code machen:

WriteUsers(users.Select(user => string.Format("{0}: {1}", 
               users.Username, users.Pin))); 

Ob das für Sie arbeitet oder nicht auf die Details ab.

+0

In meinem Fall ich muss die Benutzernamen/Pins an verschiedenen Orten und in verschiedenen Formaten verwenden, also glaube ich nicht, dass das funktionieren würde. Ich werde den Beitrag bearbeiten, um das deutlicher zu machen. Trotzdem danke! –

1

Zunächst, für die Benutzerfreundlichkeit, empfehle ich, Ihre IList zu einem IEnumerable zu wechseln. Vorausgesetzt, Sie tun keine andere Logik, die die Liste erfordert, öffnet es Ihre Klasse für mehr Benutzer nutzbar und hat keinen Nachteil.

Wenn Sie die Auswahl dessen, was aus Ihrer Klasse gedruckt wird, vollständig eliminieren möchten, kann ich mir einige Optionen vorstellen.

Eine (obwohl möglicherweise weniger verwendbar) wäre, Reflexion zu verwenden. Wenn perf. kein großes Problem ist, können Sie es wie etwas Refactoring könnte haben:

WriteElements (IEnumerable Elemente, params string [] propertiesToWrite)

Dann könnten Sie einfach die Methode Refactoring, so dass es Reflexion verwendet das bekommen Eigenschaften aus dem Typ-Spezifizierer für T, und schreiben Sie eine beliebige Anzahl von ihnen.Der Anrufer tun würde, dann:

WriteElements(listOfUsers, "Username", "Password"); 

Eine zweite, wahrscheinlich sauberer, Option wäre es, Refactoring zu nehmen:

WriteElements(IEnumerable<UserBO>, Func<UserBO,string>); 

Man könnte es dann rufen mit:

// Call using password 
WriteElements(listOfUsers, user => user.Password); 

// or call using pin 
WriteElements(listOfUsers, user => user.Pin); 
Verwandte Themen