.NET - Generische Sammlung in DataTable konvertieren
Ich versuche zu konvertieren, eine generische collection (Liste) zu einer DataTable. Ich fand den folgenden code, um mir zu helfen, dies zu tun:
//Sorry about indentation
public class CollectionHelper
{
private CollectionHelper()
{
}
//this is the method I have been using
public static DataTable ConvertTo<T>(IList<T> list)
{
DataTable table = CreateTable<T>();
Type entityType = typeof(T);
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
foreach (T item in list)
{
DataRow row = table.NewRow();
foreach (PropertyDescriptor prop in properties)
{
row[prop.Name] = prop.GetValue(item);
}
table.Rows.Add(row);
}
return table;
}
public static DataTable CreateTable<T>()
{
Type entityType = typeof(T);
DataTable table = new DataTable(entityType.Name);
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
foreach (PropertyDescriptor prop in properties)
{
//HERE IS WHERE THE ERROR IS THROWN FOR NULLABLE TYPES
table.Columns.Add(prop.Name, prop.PropertyType);
}
return table;
}
}
Mein problem ist, dass ich beim ändern einer der Eigenschaften der MySimpleClass zu einem nullable-Typ, bekomme ich die folgende Fehlermeldung:
DataSet does not support System.Nullable<>.
Wie kann ich das mit Nullable-Eigenschaften/Feldern in meiner Klasse?
InformationsquelleAutor der Frage Ronnie Overby | 2009-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dann vermutlich wirst du brauchen, um Sie zu heben, um die null-form, mit
Nullable.GetUnderlyingType
und vielleicht ein paarnull
WerteDbNull.Value
...Ändern Sie die Zuweisung zu:
und beim hinzufügen von Spalten zu:
Und es funktioniert. (
??
ist die null-coalescing operator; es verwendet den ersten Operanden, falls es nicht null ist, sonst wird der zweite operand ausgewertet und verwendet)InformationsquelleAutor der Antwort Marc Gravell
Gut. Seit DataSet unterstützt nicht nullable-Typen, Sie müssten zu überprüfen, wenn die Eigenschaft ist ein generischer Typ, Holen Sie die generische definition von dieser Art und bekomme dann das argument (das ist der tatsächliche Typ) verwenden, vielleicht
Nullable.GetUnderlyingType
. Wenn der Wert null ist, verwenden Sie einfachDBNull.Value
im DataSet.InformationsquelleAutor der Antwort J. Steen
Wenn
Nullable.GetUnderlyingType()
Ihreprop.PropertyType
gibt einen nicht-null-Wert verwenden, als den Typ einer Spalte. Andernfalls verwenden Sieprop.PropertyType
selbst.InformationsquelleAutor der Antwort Anton Gogolev
Hier eine version mit einigen Modifikationen, damit für null und '\0' - Zeichen ohne Sprengung der DataTable.
InformationsquelleAutor der Antwort landers
Ich weiß, diese Frage ist alt, aber ich hatte das gleiche Problem für eine Erweiterung Methode die ich gemacht habe. Mit der Antwort von Marc Gravell, ich war in der Lage zu ändern mein code. Diese Erweiterung Methode behandeln Listen von primitiven Datentypen, strings, Aufzählungen und Objekte mit primitiven Eigenschaften.
InformationsquelleAutor der Antwort Halcyon