2017-11-21 5 views
3

Ich versuche, eine generische Methode zu erstellen, um eine Abfrage auszuführen, wo ich gespeicherten Prozesnamen und die Parameter ggf. übergeben kann.Übergeben Sie generische an die Erweiterungsmethode

Nach dem Ausführen der Abfrage werden die Ergebnisse in einer DataTable gespeichert, die in eine Liste konvertiert werden muss.

DataTableToList()

ist ein Verlängerungsverfahren, welches das gleiche tun.

Nur relevante Code dargestellt

Caller

 var results= dh.ExecuteDataSet<EmployeeModel>("USP_GetEmployeeByID", new Dictionary<string, IConvertible>() 
     { 
       {"@ID", 1000} 
      }); 

DAL Code

public IEnumerable<T> ExecuteDataSet<T>(string storedProcName, IDictionary<string, IConvertible> parameters = null) 
      {        
        var result = db.ExecuteDataSet(q); 

        DataTable dtResult = result.Tables[0]; 

        var t = dtResult.DataTableToList<T>(); //Compile time error: The type T must be a reference type in order to use it as parameter 

         return t; 

       } 

Erweiterungsmethode

public static List<T> DataTableToList<T>(this DataTable table) where T : class, new() 
     { 
      try 
      { 
       List<T> list = new List<T>(); 

       foreach (var row in table.AsEnumerable()) 
       { 
        T obj = new T(); 

        foreach (var prop in obj.GetType().GetProperties()) 
        { 
         try 
         { 
          PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name); 
          propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null); 
         } 
         catch 
         { 
          continue; 
         } 
        } 

        list.Add(obj); 
       } 

       return list; 
      } 
      catch 
      { 
       return null; 
      } 
     } 

Das Problem ist, dass die Erweiterung Methodenaufruf die Kompilierung Fehler

The type T must be a reference type in order to use it as parameter compile time error. 

gibt also, welche Änderungen sind auf die Erweiterungsmethode gemacht werden, so dass es ein generischer als akzeptiert Streit?

+0

'DataTableToList' hat eine generische Einschränkung' T: class', aber die andere Erweiterungsmethode hat diese Einschränkung nicht. Deshalb sehen Sie diesen Fehler. Sie müssen dort auch die gleiche Einschränkung anwenden. –

Antwort

5

Dieses Verfahren die Art Zwänge des Erweiterungsmethode erfüllen kann:

public IEnumerable<T> ExecuteDataSet<T>(
    string storedProcName, 
    IDictionary<string, IConvertible> parameters = null) 

auch die Typparameter benötigt.

where T : class, new() 
2

Fügen Sie where T : class zu Ihrer DAL-Methode hinzu. Der Compiler muss wissen, dass Ihre T in der DAL-Methode

Verwandte Themen