Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用泛型返回扩展方法_C#_Generics_Extension Methods - Fatal编程技术网

C# 使用泛型返回扩展方法

C# 使用泛型返回扩展方法,c#,generics,extension-methods,C#,Generics,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 val

是否可以使用返回类型

例如,我有以下方法:

// 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(“有形权益”);

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

这是可能的。它可以是如下所示:

// 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);
}
//获取行内字段的方便方法(作为T类型)
公共静态T Get(此数据行,字符串字段){
if(row!=null&&row.Table.Columns.Contains(字段))
{
对象值=行[字段];
if(value!=null&&value!=DBNull.value)
返回(T)值;
}
返回默认值(T);
}

DataRow有一个名为的扩展方法,该方法将完成您正在尝试做的事情。我不确定它在double上使用null值时的行为(我知道它将处理可为null的类型)。这可能不是你想要的,但值得一看

double value = row.Field<double>("tangible-equity");
double value=行字段(“有形权益”);
这个怎么样:

    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);
    }
public static T Get(此数据行,字符串字段),其中T:IConvertible
{
if(row!=null&&row.Table.Columns.Contains(字段))
{
对象值=行[字段];
if(value!=null&&value!=DBNull.value)
return(T)Convert.ChangeType(value,typeof(T));
}
返回默认值(T);
}

处理转换要比只进行转换灵活得多。这几乎反映了您的原始代码,只是泛型。

它不是Linq。它只是DataRow上的一个扩展方法。这几乎正是您试图构建的内容。我认为您必须向System.Data.DataSetExtensions.dllSystem.InvalidCastException添加ref:指定的强制转换无效。如果您的数据库列与T的类型不同,则会发生这种情况。@BrokenGlass的答案应该正确转换不同类型的对象。这种情况经常发生从数据库处理数据类型。更好地使用Convert.ChangeType()应该支持实现IConvertibleBTW的所有类型,正如您所知,您只需编写“double value=row.Get(“有形权益”);”并跳过“”,因为编译器会解决它