扩展方法返回使用泛型

时间:2011-01-09 02:47:23

标签: c# generics extension-methods

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

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

3 个答案:

答案 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");