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?
'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. –