2016-09-30 4 views
-1

Ich versuche, Inhalt aus einem Dataset in einer Liste abzubilden, aber ich möchte in der Lage sein, den Typ in die Funktion zu übergeben. Ich habe den folgenden Code bereits:Wie kann ich in C# -Webformularen eine Liste aus einem Dataset mit generischen Typen laden?

public class WorkOrderAttachment : DatabaseObject 
{ 
    [TableData] 
    //public List<int> attachment_id { get; set; } 
    public int attachment_id { get; set; } 
    [TableData] 
    //public List<int> wo_id { get; set; } 
    public int wo_id { get; set; } 

    public WorkOrderAttachment() 
    { 

    } 

. . .

public class DatabaseObject 
{ 
    private string _ConnectionString = ""; 

. . .

public static List<T> LoadDataAll<T>(T type, DataSet ds) 
    { 
     List<T> fillList = new List<T>(); 
     if (ds.Tables[0].Rows.Count > 0) 
     { 
      foreach (DataRow dr in ds.Tables[0].Rows) 
      { 
       foreach (var prop in type.GetType().GetProperties()) 
       { 
        if (prop.GetCustomAttributes(typeof(TableData), false).Length > 0 && ds.Tables[0].Columns.Contains(prop.Name.ToLower())) 
        { 
         if (dr[prop.Name.ToLower()] != DBNull.Value) 
         { 
          prop.SetValue(type, Convert.ChangeType(dr[prop.Name.ToLower()], prop.PropertyType), null); 
         } 
         else 
         { 
          // If we are using a string and the value is null, default to an empty string instead 
          if (prop.PropertyType == typeof(String)) 
          { 
           if (dr[prop.Name.ToLower()] == DBNull.Value) 
           { 
            prop.SetValue(type, "", null); 
           } 
          } 
         } 
        } 
       } 
       fillList.Add(type); 
      } 
     } 
     return fillList; 
    } 

. . .

ich es so bin mit:

return DatabaseObject.LoadDataAll<WorkOrderAttachment>(new WorkOrderAttachment(), ds); 

Dies funktioniert, aber vorstellen, gibt es zwei Zeilen in der Tabelle in der Datenmenge. Das erste Mal, wenn dies durchläuft, wird es zu fullList.Add (type) und legt die Daten an Ort und Stelle wie es sollte. "attachment_id = 1, wo_id = 1000"

Beim nächsten Durchlauf wird jedoch "attachment_id = 2, wo_id = 1000" gesetzt. Alles sieht gut aus, ist es aber nicht. Wenn ich die fillList überprüfe, finde ich zwei Einträge, die aber beide den letzten Eintrag "attachment_id = 2, wo_id = 1000" duplizieren. Die erste Instanz (von der ich weiß, dass sie eingesetzt wird) wird wegen der Art und Weise überschrieben, wie sie durch Verweis gehandhabt wird, denke ich.

(Ich will nicht Entity Framework oder andere ORM in diesem Szenario verwenden, aber auch andere Möglichkeiten, um die Daten aus den in einer Liste gesetzt Daten würden zu schätzen wissen.)

ich in der Lage sein wollen geben sie so etwas wie dieses (Pseudocode):

List<WorkOrderAttachment> Attachments = DatabaseResult(); 

Aber, ich will es auch so generisch sein, dass ich jede Art in DatabaseResult setzen und meine Antwort als eine Liste bekommen bereits mit den Daten geladen . Vorschläge, wie Sie dies beheben oder eine bessere Lösung implementieren können, sind willkommen.

Antwort

0

Ich fand die Antwort innerhalb einer anderen Frage bei StackOverflow, obwohl meine Frage anders ist als diese. Die Antwort ist die gleiche: In C#, how to instantiate a passed generic type inside a method?

public static List<T> LoadDataAll<T>(DataSet ds) where T : new() 
{ 

. . .

foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     T type = new T(); 
     foreach (var prop in type.GetType().GetProperties()) 
     { 

. . .

Mithilfe der where T: new() - Syntax kann ich für jede Zeile einen neuen Typ erstellen, der an die zurückgelieferte fillList übergeben wird. Meine Verwendung dieses Verfahrens ist wie folgt:

return DatabaseObject.LoadDataAll<WorkOrderAttachment>(ds); 

Das zurückgegebene Ergebnis ist eine WorkOrderAttachment Liste und ich einfach im Datensatz übergeben.

Verwandte Themen