2017-03-03 1 views
1

Ich versuche, eine Methode mit einem optionalen generischen Typ zu erstellen, um die Anzahl der Abfragen in einer SQL-Datenbank zu minimieren. (Keine Notwendigkeit, eine Abfrage auszuführen, wenn die Daten bereits vorhanden ist)Optionale generische Typen ohne manuell angeben zu müssen Typ

// Returns proper DataTable for selected Schedule 
    public static DataTable BuildReportTable<T>(Report report, List<T> InputList = null) 
    { 
     switch (report.ReportBase) 
     { 
      // Work Order Report 
      case 1: 
       List<ReportWorkOrder> wos = new List<ReportWorkOrder>(); 
       if (InputList == null) 
       { 
        // Build WorkOrderReportList for report if none was passed 
        PullSQLData(() => 
        { 
         wos = MPulseQueries.WorkOrderTableQuery(); 
        }, 30, 46, "Failed to pull Work Order Data to generate table"); 
       } 
       else 
       { 
        // If WorkOrderReportList was passed, use it 
        wos = InputList as List<ReportWorkOrder>; 
       } 
       switch (WOFilters[report.Filter][0]) 
       { 
        case 0: //If all work orders report 
         return AllWOTable(report, wos); 
        case 1: //If open non PM work orders report 
         return OpenNonPMTable(report, wos); 
        case 2: //If open PM work orders report 
         return PMTable(report, wos); 
        case 3: //If open fluid change work orders report 
         return FluidChangeTable(report, wos); 
        case 4: //If custom filter work orders report 
         return CustomFilterTable(report, wos); 
        default: 
         return new DataTable(); 
       } 
      default: 
       return new DataTable(); 
     } 
    } 

Dieser Code kompiliert ohne Probleme und führt wie erwartet. Das einzige Problem, das ich habe, ist, dass, um diese Methode ohne den optionalen Parameter aufzurufen, ich einen Typ manuell angeben muss.

DataTable DisplayedWorkOrders = BuildReportTable<ReportWorkOrder>(report); 

Also, für meine Frage: Gibt es eine Möglichkeit, dass ich einen Standard-Typen in dem Verfahren festgelegt, so dass ich angeben muß jedes Mal, wenn ich es nicht nennen?

Antwort

1

Sie könnten eine nicht-generic Überlastung hinzufügen:

public static DataTable BuildReportTable(Report report) 
{ 
    return BuildReportTable<ReportWorkOrder>(report); 
} 

, dass ein gemeinsames und durchaus beachtliches Idiom ist (na ja, der nicht verwendete Typ Parameter Chaps mich nur ein bisschen, aber ich werde darüber hinwegkommen).

Sonst steckst du fest; die Parameter müssen fließen, egal wie.

+0

Ich kann damit leben. Das hält es beim Aufruf der Methode sauber, was mein Ziel ist. Vielen Dank! –

+1

Ich bin auch kein Fan des unbenutzten Typparameters, aber besser versteckt hier als im Gegensatz zum Zeitpunkt des Aufrufs. –

+0

Ja. Aus dem Auge, aus dem Sinn. –