是否可以使用generic返回extension methods类型?
例如,我有以下方法:
// 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 :(得分: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处理转化更灵活,而不仅仅是投射。这几乎反映了您的原始代码,只是通用的。
答案 1 :(得分: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);
}
答案 2 :(得分:1)
DataRow有一个名为Field的扩展方法,它可以完成你想要做的事情。我不确定它在double上的空值如何(我知道它将处理可空类型)。这可能不是您想要的,但值得一看。
double value = row.Field<double>("tangible-equity");