2016-06-30 19 views
0

Ich habe eine Methode, die Tage Namen von einem bestimmten Objekt, wie folgt extrahieren:Machen Sie eine Methode generische

private string ExtractWeekDayNames(FiscalReceipt fiscalReceipt) 
    { 
     string retVal = ""; 

     Dictionary<string, bool> WeekDays = 
      new Dictionary<string, bool>() { 
              { "Sun", fiscalReceipt.Sunday }, 
              { "Mon", fiscalReceipt.Monday }, 
              { "Tue", fiscalReceipt.Tuesday }, 
              { "Wed", fiscalReceipt.Wednesday }, 
              { "Thu", fiscalReceipt.Thursday }, 
              { "Fri", fiscalReceipt.Friday }, 
              { "Sat", fiscalReceipt.Saturday } 
              }; 


     //Find week days 
     foreach (var item in WeekDays) 
     { 
      if (item.Value == true) 
       retVal += item.Key + ","; 
     } 

     if (!string.IsNullOrEmpty(retVal)) 
      retVal = retVal.Substring(0, retVal.Length - 1); 

     return retVal; 

    } 

Ich habe auch ein ähnliches Verfahren, die die gleichen Operationen führen aber eine andere Art von Parametern mit wie:

private string ExtractWeekDayNames(NonFiscalReceipt nonFiscalReceipt) 
{ 
    ... 
} 

auch hat die NonFiscalReceipt die Eigenschaften Sonntag, Montag, usw.

Wie kann ich ersetzen diese 2 Methoden mit nur einem?

+2

Sind Fiskalrecipent und nonfiscalreceipt vom gleichen Typ der Basisklasse abgeleitet? Wenn ja, können Sie das Argument als Basisklasse verwenden. – JonH

+2

Sie können das verkürzen, um 'string.Join (", ", WeekDays.Where (kvp => kvp.Value) zurückzugeben. Wählen Sie (kvp => kvp.Key));' – juharr

+1

Sie können z. Erstellen Sie eine Schnittstelle mit den Wochentageigenschaften und lassen Sie sie von beiden Klassen implementieren. Dann können Sie die Schnittstelle an Ihre Methode anstelle der aktuellen Klasse übergeben. – Philippe

Antwort

-1

erstellen Basis-Interface für NonFiscalReceipt und FiscalReceipt, die die gemeinsame Eigenschaften enthalten:

public interface IReceipt 
{ 
    bool Sunday{get;} 
    ...... 
} 

die Methodensignatur mit diesem ersetzen: private string ExtractWeekDayNames(IReceipt fiscalReceipt)

Try DayOfWeek Enum zu verwenden, wenn es möglich ist.

+0

Ist diese Methodensignatur richtig? Würdest du das Interface nicht aufnehmen? – JonH

+0

@JonH richtig, ich habe es von der Antwort kopiert und vergessen, es zu aktualisieren. Danke –

+0

Danke Radin – Ciupaz

2
public class FiscalReceipt : Receipt{ 
FiscalReceipt specific fields 
} 

public class NonFiscalReceipt : Receipt{ 
NonFiscalReceipt specific fields.. 
} 

public class Receipt{ 
fields common to both classes 
} 

private string ExtractWeekDayNames(Receipt receipt){ 

} 

Beide Arten von Eingang vom Eingang erben, das war man entweder passieren können und werden noch alle Felder haben :)

1

Sie benötigen eine gemeinsame Schnittstelle für Ihre Klassen erstellen zu implementieren, so dass Die Methode könnte alles akzeptieren, was diese Schnittstelle implementiert.

interface IReceipt 
{ 
    bool Sunday {get; } 
    bool Monday {get; } 
    ... 
    bool Saturday {get; } 
} 

dann Ihre Methode sollte wie folgt aussehen:

private string ExtractWeekDayNames<T>(T receipt) where T : IReceipt 
{ 
    string retVal = ""; 

    Dictionary<string, bool> WeekDays = 
     new Dictionary<string, bool>() { 
             { "Sun", receipt.Sunday }, 
             { "Mon", fiscalReceipt.Monday }, 
             { "Tue", receipt.Tuesday }, 
             { "Wed", receipt.Wednesday }, 
             { "Thu", receipt.Thursday }, 
             { "Fri", receipt.Friday }, 
             { "Sat", receipt.Saturday } 
             }; 


    //Find week days 
    foreach (var item in WeekDays) 
    { 
     if (item.Value == true) 
      retVal += item.Key + ","; 
    } 

    if (!string.IsNullOrEmpty(retVal)) 
     retVal = retVal.Substring(0, retVal.Length - 1); 

    return retVal; 

} 

jedoch, als juharr und Remy Grandin in den Kommentaren schrieb zu Recht - Es besteht keine Notwendigkeit für Generika in diesem Fall - können Sie einfach Übergeben Sie die Schnittstelle an die Methode:

private string ExtractWeekDayNames(IReceipt receipt) 
{ 
    string retVal = ""; 

    Dictionary<string, bool> WeekDays = 
     new Dictionary<string, bool>() { 
             { "Sun", receipt.Sunday }, 
             { "Mon", receipt.Monday }, 
             { "Tue", receipt.Tuesday }, 
             { "Wed", receipt.Wednesday }, 
             { "Thu", receipt.Thursday }, 
             { "Fri", receipt.Friday }, 
             { "Sat", receipt.Saturday } 
             }; 


    //Find week days 
    foreach (var item in WeekDays) 
    { 
     if (item.Value == true) 
      retVal += item.Key + ","; 
    } 

    if (!string.IsNullOrEmpty(retVal)) 
     retVal = retVal.Substring(0, retVal.Length - 1); 

    return retVal; 

} 
+1

Aber an dieser Stelle könnten Sie nur die Schnittstelle übergeben, anstatt Generika zu verwenden. – juharr

+0

Warum sollte T generic verwendet werden, wo der typisierte Parameter der Schnittstelle genügt hätte? –

+0

Guter Punkt, es ist nur wegen des Titels der Frage. wird meine Antwort bearbeiten. –

Verwandte Themen