Laden...

Datentypen zur Laufzeit auflösen?

Erstellt von #coder# vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.095 Views
#coder# Themenstarter:in
395 Beiträge seit 2008
vor 7 Jahren
Datentypen zur Laufzeit auflösen?

Hallo,

ich möchte eine Tabelle einlesen, welche verschiedene Datentypen pro Spalte enthaltan kann, z.B. sei folgende Tabelle gegeben:

|Id|Name|ValueInt|ValueDouble|ValueString|ValueDate|...
|1|Peter|123|78.03|Hallo Welt|19.01.2017|...
|2|Hans|789|1.23|Hallo Welt|22.01.2017|...

In einer Konfigurationsmaske soll der Benutzer bereits die Spalten mit den richtigen .NET Datentypen zuweisen und einer DB hinterlegen können, so das beim Einlesen bereits die richtigen Typen (Generic T) hinterlegt werden. Meine Klasse Pro Datensatz sollte wie folgt aussehen:

public class ItemAttribute<T>
{
   public string Name { get; set; }

   public T Value { get; set; }
}
  1. Wie muss ich die Datentypen aus der Tabelle speichern, damit diese später zur Laufzeit aufgelöst werden können?
  2. Wie kriege ich nun das dynamische auflösen der Datentypen zur Laufzeit hin, wenn die übergeordnete Container Klasse wie folgt aussieht?
public class Table
{
   public List<ItemAttribute<<???>> Attributes { get; set; }
}

Wie könnte der Aufruf nun realisiert werden?

var dbResult = GetRecordsFromDB();

   Table table = new Table();

   foreach(var record in dbResult)
   {
      table.Attributes.Add(new ItemAttribute<record.Datatype>())
   }
D
985 Beiträge seit 2014
vor 7 Jahren

Schau dir mal eine DataTable an, damit wurde genau das Problem gelöst.

T
2.224 Beiträge seit 2008
vor 7 Jahren

Ich verstehe nicht genau was du hier vorhast.
Willst du hier sowas wie eine dynamische Tabelle realisieren?
Wirst du mit einer relationellen DB so nicht umsetzen können.
Hier muss die Struktur der Tabelle bereits vorgegeben sein und somit auch die Datentypen bekannt sein.
Deine Daten scheinen kein sinnvolles Format zu haben, wenn die Daten in unterscheidlichen Datentypen kommen und deine Benutzer hier scheinbar sich sogar mit Datentypen aus der Programmierung auskennen müssen, genzt auch den Nutzen der Software stark ein.

Ohne den genauen Zweck deiner Umsetzung zu kennen, würde ich auch nicht wissen was du hier genau vorhast.
Der Benutzer sollte in der Regel sich nicht um Datentypen oder dynamische Daten kümmern müssen.
Entsprechend wäre auch mal interessant wer das Tool am Ende zu welchem Zweck verwenden soll.

Was du hier planst dürfte enormer Aufwand sein, desen Nutzen sich mir auch nicht sinnvoll erschließt.
Wenn du erklären kannst, was du damit vor hast, kann man hier vielleicht einen besseren Ansatz liefern.

@Sir Rufus
Würde mich wundern, wenn er "nur" ein DataTable nachprogrammieren wollte.
Klingt für mich nicht so ganz danach auch wenn der Beispiel Code darauf schließen lässt.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

D
985 Beiträge seit 2014
vor 7 Jahren

@T-Viro

Ich lese bis jetzt nur dass die Struktur-Informationen der Datei in einer Datenbank hinterlegt werden soll und nicht die Daten aus der Datei damit in die Datenbank geschrieben werden sollen.

So eine Strukturinformation ist problemlos in einer Datenbank abbild- und speicherbar.

5.658 Beiträge seit 2006
vor 7 Jahren

Hi #code#,

es gibt noch die Möglichkeit, in der DB jeweils eine Tabelle [Id, Name, Value] für jeden Parameter-Datentyp anzulegen. Dann kann man das Ganze auch mit den geeigneten SQL-Datentypen speichern und dann ganz normal mit OOP verarbeiten oder sogar mit einem ORM-System verwenden.

Weeks of programming can save you hours of planning

3.003 Beiträge seit 2006
vor 7 Jahren

Neben den Anmerkungen der anderen hast du noch einen weiteren Denkfehler.

public class Table  
{  
   public List<ItemAttribute<<???>> Attributes { get; set; }  
}  
  

Nope, das wird so nicht funktionieren. ItemAttribute<string> ist ein völlig andererer Typ als ItemAttribute<int>.

Beide können nur in einer Collection List<ItemAttribute> gemeinsam gesammelt werden, wenn sie eine gemeinsame nichtgenerische Basisklasse haben. Das heisst, noch einmal deutlich: List<ItemAttribute<???>> geht nicht, nur List<ItemAttribute<string>> oder List<ItemAttribute<int>>, das ist aber beides nicht das, was du möchtest.

Und das wiederum bringt dich beim unboxing in die Situation, dass du wieder am Startpunkt bist und nicht weisst, welcher konkrete Typ und damit welcher generische Parameter benutzt wird. So drehst du dich nur im Kreis.

Die Lösung für das Dilemma besteht aus meiner Sicht, das Schema (die Struktur) in XML zu hinterlegen und daraus zur Laufzeit einen Container zu erstellen, der Zugriff auf eine Sammlung von Objekten bietet, die dem Schema entsprechen. Und, Überraschung! - so etwas gibt es schon und wurde auch schon genannt: DataTable (bzw, genauer: ein typisiertes DataSet). Das muss man nicht mögen (weil es ein ziemliches Codemonster ist), aber letzten Endes bildet es genau ab, was du machen möchtest. ErfinderDesRades hier aus dem Forum hat dazu ein recht eingängiges Tutorial.

Alle anderen Ansätze laufen aus meiner Sicht immer darauf hinaus, die Struktur der Daten in irgendeiner Weise serialisiert zu speichern. Du kannst das auch selbst und schlanker als Dataset implementieren (habe ich auch schon für ein Projekt gemacht), aber Dataset ist erst einmal eine funktionierende Lösung.

Grüße,

LaTino
EDIT: Tags korrigiert

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)