Frage: Ich benutze die unten Klasse eine CSV-Datei zuSystem.Reflection, wie Feld- und Eigenschaftsposition erhalten?
List<MyCsvFileType>
Dann konvertiere ich die List<MyCsvFileType>
auf eine Datentabelle mit
MyConvertTo
serialisiert (auch unten aufgeführt). Das Problem ist jetzt, MyConvertTo ändert die Position der Spalten, was bedeutet, dass alle Eigenschaften nach allen öffentlichen Variablen kommen.
Das Problem, das verursacht, ist, dass ich anschließend SqlBulkCopy verwenden, um die DataTable in eine Datenbanktabelle zu kopieren. Und leider verwendet SqlBulkCopy die Indizes der Spalte anstelle des Spaltennamens für die automatische Zuordnung Datentabelle zu Datenbanktabelle.
Was bedeutet, dass ich nette Fehlermeldungen bekommen, weil es die alphanumerischen AP_FL_CADKey im Schwimmerbereich Feld einzufügen versucht (weil meine Datenbank-Tabellen das gleiche Layout wie die Klasse haben) ...
Gibt es eine Möglichkeit Ich kann die Position der Felder & Eigenschaften in MyConvertTo bekommen? Also muss ich meine Datenbanktabellen (Lose) nicht ändern oder meine eigene Implementierung von BulkCopy schreiben, , weil ich nicht auch die Zuordnung zwischen Datentabelle und Datenbanktabelle manuell festlegen möchte?
Es sollte möglich sein, im schlimmsten Fall durch die durch die Felder Offsets Sortierung ...
Klasse:
[FileHelpers.IgnoreFirst]
[FileHelpers.IgnoreEmptyLines]
public class MyCsvFileType
{
public string FL_CADKey;
public string FL_DWG;
public string FL_ObjID;
public string FL_Area;
public double FL_Area_double
{
get
{
if (string.IsNullOrEmpty(this.FL_Area))
return 0.0;
else
return System.Convert.ToDouble(this.FL_Area);
}
} // End Property PP_Area_double
public string AP_FL_CADKey;
public System.Guid UID
{
get
{
return System.Guid.NewGuid();
}
} // End Property UID
}
MyConvertTo:
public static DataTable MyConvertTo(dynamic custs)
{
DataTable dt = MyCreateTable(custs);
System.Data.DataRow dr = null;
foreach (dynamic cli in custs)
{
Console.WriteLine();
Type t = cli.GetType();
dr = dt.NewRow();
foreach (System.Reflection.FieldInfo fi in t.GetFields())
{
dr[fi.Name] = fi.GetValue(cli);
}
foreach (System.Reflection.PropertyInfo pi in t.GetProperties())
{
dr[pi.Name] = pi.GetValue(cli, null);
}
dt.Rows.Add(dr);
} // Next cli
return dt;
}
public static DataTable MyCreateTable(dynamic custs)
{
DataTable table = new DataTable("Table_1");
foreach (dynamic cli in custs)
{
Console.WriteLine();
Type t = cli.GetType();
foreach (System.Reflection.FieldInfo fi in t.GetFields())
{
table.Columns.Add(fi.Name, fi.FieldType);
//Console.WriteLine(fi.Name + ": " + fi.GetValue(cli));
}
foreach (System.Reflection.PropertyInfo pi in t.GetProperties())
{
table.Columns.Add(pi.Name, pi.PropertyType);
//Console.WriteLine(pi.Name + ": " + pi.GetValue(cli, null));
}
break;
} // Next cli
return table;
}
nicht, aber Sie können ein Attribut wie PositionAttribute (Position = 1) usw. –
@Adrian Iftode erstellen: Argh, ich würde lieber dann meine eigenen Serializer schreiben. –
Die meisten der Serializer verwenden Attribut basierte Serialisierung Metadaten über Eigenschaften, Klassen zu bekommen .. –