【问题标题】:Extension method return using generics使用泛型返回扩展方法
【发布时间】:2011-06-05 23:04:21
【问题描述】:

是否可以使用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");

这可能吗?如果可以,该方法会是什么样子?

【问题讨论】:

  • 顺便说一句,你知道,你可以简单地写“double value = row.Get("tangible-equity");"并跳过“”,因为编译器会弄清楚

标签: c# generics extension-methods


【解决方案1】:

这个怎么样:

    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 处理转换比仅仅转换要灵活得多。这几乎反映了您的原始代码,只是通用的。

【讨论】:

  • 应该支持所有实现IConvertible的类型
【解决方案2】:

这是可能的。可能是这样的:

// 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);
}

【讨论】:

  • System.InvalidCastException: 指定的强制转换无效。
  • 如果您的数据库列与 T 的类型不同,就会发生这种情况。@BrokenGlass 的答案应该正确转换不同类型的对象。
  • 在处理数据库中的数据类型时经常会发生这种情况
  • 同意。最好使用 Convert.ChangeType()
【解决方案3】:

DataRow 有一个名为Field 的扩展方法,它可以做很多你想做的事情。我不确定它在 double 上的 null 值会如何表现(我知道它将处理可空类型)。这可能不是您想要的,但值得一看。

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

【讨论】:

  • 不是 Linq。它只是 DataRow 上的一个扩展方法。它几乎正是您想要构建的。
  • 我认为您必须将 ref 添加到 System.Data.DataSetExtensions.dll
猜你喜欢
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2016-09-13
  • 1970-01-01
相关资源
最近更新 更多