如何使用Field <T>和Type?

O.O*_*O.O 6 c# generics linq-to-dataset

我有一个方法,确定一个列的最小和最大DataTable:

public void GetMinMaxRange( DataTable data, string valueColumnName )
{
   var min = data.AsEnumerable().Min(m => m.Field<double>(valueColumnName));
   var max = data.AsEnumerable().Max(m => m.Field<double>(valueColumnName));
}
Run Code Online (Sandbox Code Playgroud)

我想重构这个:

public void GetMinMaxRange( DataTable data, string valueColumnName )
{
   DataColumn column = data.Columns[valueColumnName];
   var min = data.AsEnumerable().Min(m => m.Field<column.DataType>(valueColumnName));
   var max = data.AsEnumerable().Max(m => m.Field<column.DataType>(valueColumnName));
}
Run Code Online (Sandbox Code Playgroud)

我需要确定数据类型并使用它而不是硬编码m.Field<double>.这该怎么做?

更新 至于我为什么要计算最小值和最大值之间的差异

    public static double/decimal/int GetMinMaxRange<T>(DataTable data, 
          string valueColumnName) where T : IComparable<T>
    {
        DataColumn column = data.Columns[valueColumnName];
        var min = data.AsEnumerable().Min(m => m.Field<T>(valueColumnName));
        var max = data.AsEnumerable().Max(m => m.Field<T>(valueColumnName)); ;
        return max - min;
    }
Run Code Online (Sandbox Code Playgroud)

Jam*_*xon 6

简单地将其创建为通用应该有效:

public void GetMinMaxRange<T>( DataTable data, string valueColumnName ) 
                                                             where T : IComparable<T>
{
   DataColumn column = data.Columns[valueColumnName];
   var min = data.AsEnumerable().Min(m => m.Field<T>(valueColumnName));
   var max = data.AsEnumerable().Max(m => m.Field<T>(valueColumnName));
}
Run Code Online (Sandbox Code Playgroud)

然后你将用作:

GetMinMaxRange<MyType>(dataTable, valueColumnName);
Run Code Online (Sandbox Code Playgroud)

  • 你需要`其中T:IComparable <T>` (2认同)