将DataTable值转换为通用类型

时间:2015-06-30 18:04:31

标签: c# generics datatable

我正在尝试将DataTable值转换为指定的泛型类型但我收到错误。

我已经编写了一个类似的功能,工作正常。它返回一个我可以用来放入TextBox或ComboBox的字符串,我试图修改它以改变它的返回类型。这是:

/// <summary>
/// Get Value from a DataTable
/// </summary>
/// <typeparam name="T">Type of Value to get from the DataTable : int | Single | string | double</typeparam>
/// <param name="columnName">Name of the column in the DataTable</param>
/// <param name="table">The DataTable</param>
/// <returns>Get the string value to put in a Textbox</returns>
public static string getDB<T>(string columnName, DataTable table, int index = 0)
{
    bool isEmpty = String.IsNullOrEmpty(Convert.ToString(table.Rows[index][columnName]));
    return (!isEmpty) ? Convert.ToString(Convert.ChangeType(table.Rows[index][columnName], typeof(T))) : "";
}

我已经完成了这个简单的更改以改变它的返回类型,但我不确定如何正确地转换我的对象,以便将我的DataTable转换为泛型类型。

public static T getDBSpecifiedType<T>(string columnName, DataTable table, int index = 0)
{
    return Convert.ChangeType(table.Rows[index][columnName], typeof(T));
}
  

错误:
  无法隐式转换类型&#39;对象&#39;到了&#39;。存在显式转换(您是否错过了演员?)

这个功能看起来很简单,而且错误信息并不复杂我只是错过了让我的功能发挥作用的东西。

感谢任何帮助,Simon

2 个答案:

答案 0 :(得分:2)

通过在SO上搜索更多答案,我最终使用的是以下内容:

public static Nullable<T> getDBSpecifiedType<T>(string columnName, DataTable table, int index = 0)
{
    if (getDB<T>(columnName, table, index) != String.Empty)
    return (T)Convert.ChangeType(table.Rows[index][columnName], typeof(T));

    return null;
}

通过调用我的原始函数,我能够确定DataTable值是否为空并返回null(我使用Nullables,因为字符串的默认值与double相比,例如不同)。如果它不为空,我可以将它转换为泛型类型并返回结果。

答案 1 :(得分:1)

这种T型铸造模型也适用于我:

public static T getDBSpecifiedType<T>(string columnName, DataTable table, int index = 0)
{
     return (T) table.Rows[index][columnName];
}

但是,您可以使用Field方法转换dataTable列类型。 Field提供对指定行中每个列值的强类型访问。

public static T Field<T>(this DataRow row,  string columnName)

例如,你可以使用这个模型:

foreach (var row in dt.AsEnumerable())                        
{
    users.Add(new User(row.Field<int>("Id")) { Name = row.Field<string>("Name") });       
};

Microsoft Reference Source