📜  c# todatatable nullable - C# (1)

📅  最后修改于: 2023-12-03 14:39:44.334000             🧑  作者: Mango

将C#数据转换为Datatable并使用Nullable

在C#开发中,我们经常需要将数据转换为DataTable,以便在数据网格中显示它们。但是,在数据转换的过程中,有时候我们需要将某些列定义为可空(Nullable),这就需要我们以不同的方式进行转换。

什么是Nullable

在C#中,Nullable是一个结构,用于处理类型不明确的特定值。它允许我们在值类型中存储Null,例如,在Int32中存储Null。

将C#数据转换为Datatable

我们可以使用以下代码来将C#中的数据转换为DataTable:

public static DataTable ToDataTable<T>(List<T> items)
{
    DataTable dataTable = new DataTable(typeof(T).Name);

    PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

    foreach (PropertyInfo prop in props)
    {
        Type propType = prop.PropertyType;

        if (propType.IsGenericType && propType.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            propType = Nullable.GetUnderlyingType(propType);
        }

        dataTable.Columns.Add(prop.Name, propType);
    }

    foreach (T item in items)
    {
        DataRow row = dataTable.NewRow();

        foreach (PropertyInfo prop in props)
        {
            row[prop.Name] = prop.GetValue(item, null) ?? DBNull.Value;
        }

        dataTable.Rows.Add(row);
    }

    return dataTable;
}

该方法接受一个列表作为参数,并返回一个DataTable。在上面的代码中,我们使用反射获取列表的属性,然后创建相应的列。如果属性是Nullable类型,则获取其基础类型。随后,我们使用反射将列表中的值添加到DataTable行中。

以Nullable示例

假设我们有以下类:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? Age { get; set; }
}

在上面的类中,Age是一个可空的属性。我们可以使用以下代码将这个类转换为一个DataTable:

List<Person> persons = new List<Person>
{
    new Person { Id = 1, Name = "John Doe", Age = 25 },
    new Person { Id = 2, Name = "Jane Smith", Age = null },
    new Person { Id = 3, Name = "Bob Johnson", Age = 30 }
};

DataTable dataTable = ToDataTable<Person>(persons);

在转换之后,我们可以在Data Grid中显示该DataTable,其中Age列可以为Null。

结论

在本文中,我们介绍了如何将C#中的数据转换为DataTable,并在转换过程中使用了Nullable类型。我们希望这篇文章对初学者有所帮助,也可以对那些需要将可空类型转换为DataTable的开发人员有所帮助。