如何避免使用泛型显式铸造

时间:2012-03-16 10:17:13

标签: c# winforms generics datagridview casting

我有一个例程,可以将DataGridView中的所有数据转换为相应的DataTable。我想扩展此方法以合并仅转换DataGridView的选定范围的功能。我可以使用基本逻辑if (bIsSelection) /*Do stuff*/ else /*Do other stuff*/清楚地做到这一点,但我想在这里使用泛型。问题是,完整的DataGridView范围是DataGridViewColumnCollection,所选范围将是DataGridViewSelectedColumnCollection,C#似乎不喜欢两者之间的任何转换,或允许隐式输入仿制药的例子。

我的代码的第一部分是

public static DataTable BuildDataSetFromDgv(DataGridView _dataGridView, 
    string strTabName)
{
    DataTable dt = new DataTable();

    dt.TableName = strTabName;
    foreach (DataGridViewColumn col in _dataGridView.Columns)
        dt.Columns.Add(col.DataPropertyName, col.ValueType);

我试过

public static DataTable BuildDataSetFromDgv<T>(DataGridView _dataGridView, 
    string strTabName, ICollection<T> _columnColl, ICollection<T> _rowColl)
{
    DataTable dt = new DataTable();

    dt.TableName = strTabName;
    //foreach (DataGridViewColumn col in _dataGridView.Columns)
    foreach (DataGridViewColumn col in _columnColl)
        dt.Columns.Add(col.DataPropertyName, col.ValueType);

由于隐式转换而无效,将_columnColl更改为_columnColl as DataGridView[Selected]ColumnCollection会使目标失败。

在这种情况下,如何使用泛型来完成这项工作?

感谢您的时间。

1 个答案:

答案 0 :(得分:3)

我不确定为什么你需要一个通用的 - 都是DataGridViewColumn的集合。例如,为什么以下不适合你?

public static DataTable BuildDataSetFromDgv(DataGridView _dataGridView, 
    string strTabName, IEnumerable columns)
{
    DataTable dt = new DataTable();
    dt.TableName = strTabName;

    var dvgColumns = columns.Cast<DataGridViewColumn>();
    foreach (var col in dvgColumns)
        dt.Columns.Add(col.DataPropertyName, col.ValueType);