2011-01-09 48 views
6

是否可以使用extension methods返回generic類型?使用泛型的擴展方法返回

例如,我有以下方法:

// Convenience method to obtain a field within a row (as a double type) 
public static double GetDouble(this DataRow row, string field) { 
    if (row != null && row.Table.Columns.Contains(field)) 
    { 
     object value = row[field]; 
     if (value != null && value != DBNull.Value) 
      return Convert.ToDouble(value); 
    } 
    return 0; 
} 

這是目前使用如下:

double value = row.GetDouble("tangible-equity"); 

但我想用下面的代碼:

double value = row.Get<double>("tangible-equity"); 

這是可能的,如果是這樣,那麼該方法是什麼樣子?

+0

順便說一句,你可以簡單的寫下「double value = row.Get(」tangible-equity「);」並跳過「」,因爲編譯器會計算出它 – 2011-01-09 03:24:50

回答

12

這個怎麼樣:

public static T Get<T>(this DataRow row, string field) where T: IConvertible 
    { 
     if (row != null && row.Table.Columns.Contains(field)) 
     { 
      object value = row[field]; 
      if (value != null && value != DBNull.Value) 
       return (T)Convert.ChangeType(value, typeof(T)); 
     } 
     return default(T); 
    } 

Convert.ChangeType是相對於只鑄造更加靈活的處理轉換。這幾乎反映了你的原始代碼,只是通用的。

3

這是可能的。這可能是類似以下內容:

// Convenience method to obtain a field within a row (as a T type) 
public static T Get<T>(this DataRow row, string field) { 
    if (row != null && row.Table.Columns.Contains(field)) 
    { 
     object value = row[field]; 
     if (value != null && value != DBNull.Value) 
      return (T)value; 
    } 
    return default(T); 
} 
+0

System.InvalidCastException:指定的轉換無效。 – 2011-01-09 03:05:28

+0

如果您的數據庫列與T的類型不同,那麼會發生這種情況。@ BrokenGlass的答案應該正確地轉換不同類型的對象。 – sgriffinusa 2011-01-09 03:07:10

+0

這會經常發生,處理來自DB – 2011-01-09 03:10:21

1

DataRow中有一個名爲Field,會做很多你正在嘗試做的擴展方法。我不確定它將如何在雙精度值上表現爲空值(我知道它將處理可爲空的類型)。這可能不是你正在尋找的,但值得一看。

double value = row.Field<double>("tangible-equity");