2017-07-29 4 views
1

Ich habe eine Datenbank mit etwa 100 oder so Tabelle. Was ich versuche zu tun, ist folgendes:Dynamische Popup generische Liste von Objekten ohne konkreten Datentyp

  1. Holen Sie sich eine Liste der Tabellen in der Datenbank.
  2. Durchlaufen Sie jede Tabelle in der Liste und wählen Sie alle Datensätze in der Tabelle in eine Datentabelle aus.
  3. Erstellen Sie für jede Datentabelle dynamisch eine allgemeine Liste von POCO-Klassen
  4. Lesen Sie jede Datenzeile und füllen Sie das Objekt, und fügen Sie es dann der Liste hinzu.

Ich bin durch Punkte 1 und 2 in Ordnung. Aber für die Punkte 3 und 4 habe ich Probleme. Hier ist der Code, ich habe:

Type type = Type.GetType(tableName); 
var list = Utility.BindList<type>(dataTable); 

Die Ausnahme, die ich bekommen ist: „‚Typ‘eine Variable ist aber wie ein Typ verwendet wird“

Und darüber nachzudenken, macht es Sinn. Natürlich, wenn ich die eigentliche Klasse statt Typ eingeben funktioniert es gut:

Type type = Type.GetType(tableName); 
var list = Utility.BindList<Person>(dataTable); 

Aber ich will keine tatsächlichen Klassen hart Code haben. By the way, hier die Unterschrift der BindList Methode, die ich oben nenne (dieser Teil funktioniert gut):

public static List<T> BindList<T>(DataTable dt) 
{ 
    // Turn Data Table into Generic List 

    return list 
} 

Hat jemand irgendwelche Vorschläge, wie dies zu tun?

Danke!


Update: Die Lösung wurde wie folgt durch Tyress vorgesehen:

Type type = Assembly.Load("[NAMESPACE PATH]").GetTypes().First(t => t.Name == tableName); 
var method = typeof(Utility).GetMethod("BindList").MakeGenericMethod(type); 
var bindResult = method.Invoke(null, new[] { datatable }); 
+0

Mögliche Duplikat [Generics in C#, Typ einer Variablen als Parameter verwendet] (https://stackoverflow.com/questions/2107845/Generics-in-c-using-Typ-einer-Variable-als-Parameter) –

+0

Eigentlich ist dies ein anderes Problem. Was ich versuche, ist, einen konkreten Datentyp von benutzerdefinierten Klassen in eine generische Funktion einzubringen. –

+0

Nein ist es nicht. Sie haben keinen konkreten Datentyp. Sie haben nur einen Typ, der zur Laufzeit bekannt ist (Sie haben ihn selbst in Ihren Fragetitel geschrieben) –

Antwort

1
  1. Für jede Datentabelle, dynamisch eine generische Liste von POCO erzeugen Klassen

Aber ich will keine tatsächlichen Klassen hart Code haben.

Ich denke, diese beiden Aussagen sind widersprüchlich? Wozu brauchst du POCO-Klassen? dynamic/ExpandoObject kann für Ihre generische Funktion verwendet werden (anstelle von type), aber ich sehe nicht wirklich, warum Sie nicht einfach Dictionary verwenden können, wenn Sie keine POCO-Klassen benötigen.

-

bearbeiten basiert auf meinem Verständnis:

var method = typeof(Utility).GetMethod("BindList").MakeGenericMethod(type); 
var bindResult = method.Invoke(null, new[] { dataTable }); 
+0

Vielleicht habe ich es nicht richtig erklärt. Nehmen wir an, wir haben zwei Tabellen namens "Person" und "Adresse" in der Datenbank. Ich versuche, alle diese Klassen durchzulaufen und den Klassendatentyp für die Datenobjektklasse nacheinander in die generische Funktion einzugeben, die generische Liste dieses Objekttyps aufzufüllen und dann die Liste zurückzugeben. Die POCO-Klasse ist im Wesentlichen EF-Klassen ähnlich, obwohl sie eigentlich nicht mit EF verwandt sind. Jede Tabellenspalte in der Datenbank hat eine Eigenschaft in der POCO-Klasse mit demselben Datentyp. –

+0

@DigiOzMultimedia Oh ich sehe jetzt, ich dachte, die Klassen existierten noch nicht und du willst sie während der Laufzeit machen, was kompliziert ist. Ich bearbeite meine Antwort basierend auf dem, was ich verstehe – Tyress

+1

Schön gemacht Tyress! Das einzige, was ich ändern musste, war die Art, wie ich die Variable "type" abrief, weil Type.GetType nur funktioniert, wenn sich die Klasse in derselben Assembly wie der ausführende Code befindet. Da die Klasse in einer anderen Assembly war, musste ich "Type type = Assembly.Load (" [ASSEMBLY NAMESPACE ") verwenden. GetTypes(). Zuerst (t => t.Name == tableName);" um den Typ zu bekommen. Von dort funktioniert Ihr Code einwandfrei. Vielen Dank für Ihre Hilfe! –

0

einfach für Entity Framework gehen, anstatt sie zu erfinden, sich noch einmal.

Verwenden Sie zuerst EF-Code und Reverse-Engineering-Elemente aus der Datenbank.

+0

Es gibt nur ein kleines Problem damit. EF ist extrem langsam und unterstützt nicht die mehr als 5000 Tabellen in SQL, die ich für andere Projekte zu unterstützen versuche (für dieses gibt es nur 100, aber ich verwende das als Vorlage an anderer Stelle). Durch die Verwendung von ADO.NET konnte ich die Geschwindigkeit der Anwendung um das 100fache steigern und so viele Datenbanktabellen unterstützen, wie ich brauche. –

Verwandte Themen