Ich versuche, nach dem Laden von Werten aus einer Datei eine generische Liste zurückzugeben. Trotz vieler Spielereien mit Typmanipulationen kann ich es immer noch nicht zum Funktionieren bringen. Der Code steht unten; meine Fragen sind:
- Muss ich jeden Schlüsseltyp identifizieren, wie ich unten beginne, oder gibt es einen schnelleren Weg? Ich sehe, dass 'where T: ...' hier relevant sein könnte, aber ich würde gerne DateTime, int, string, double usw. zulassen, wenn möglich, und ich sehe nicht, wie das mit 'where' gemacht werden kann.
- Warum kann ich mein DateTime-Element nicht zur Liste hinzufügen, die datetime ist?
- Wenn ich versuche, den Typ (listType) zu erhalten, scheint dieser den Gültigkeitsbereich zu verlassen. Selbst wenn ich den Typ in der Zeile darüber, wo ich ihn verwende, deklariere, heißt es, dass ein solches Objekt nicht existiert.
Vielen Dank für Ihre Gedanken
public static List FileToGenericList(string FilePath, int ignoreFirstXLines = 0, bool stripQuotes = true)
{
List output = new List();
Type listType = output.GetType().GetGenericArguments()[0];
try
{
using (StreamReader stream = new StreamReader(File.Open(FilePath, FileMode.Open)))
{
string line;
int currentLine = 0;
while ((line = stream.ReadLine()) != null)
{
// Erste x Zeilen überspringen
if (currentLine < ignoreFirstXLines) continue;
// Anführungszeichen entfernen, falls erforderlich
if (stripQuotes == true)
{
line = line.Replace(@"""", @"");
}
// Q1 - MUSS ICH DAS FÜR JEDE ART HABEN ODER GIBT ES EINEN SCHNELLEREN WEG
if (listType == typeof(System.DateTime))
{
DateTime val = new System.DateTime();
val = DateTime.Parse(line);
// Q2 FEHLER: 'Argumenttyp ist nicht zu Typ 'T'' zuweisbar
output.Add(val);
// Aus irgendeinem Grund ist der Typ 'listType' von oben jetzt außerhalb des Gültigkeitsbereichs, wenn ich einen Cast versuche
output.Add((listType)val);
}
if (listType == typeof(System.String))
{
//DateTime val = new System.DateTime();
//val = DateTime.Parse(line);
//output.Add(val.ToString());
}
// Fortfahren, um Zeilen für das Überspringen weiter zu verfolgen
currentLine++;
}
}
}
catch (Exception ex)
{
throw new Exception("Fehler - beim Lesen der Datei unter " + FilePath + ist ein Problem aufgetreten. Fehlerdetails: " + ex.Message);
}
return output;
}