Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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# 如何将datarow字段强制转换为泛型类型?_C#_Database_Casting_Ado.net - Fatal编程技术网

C# 如何将datarow字段强制转换为泛型类型?

C# 如何将datarow字段强制转换为泛型类型?,c#,database,casting,ado.net,C#,Database,Casting,Ado.net,我想让以下功能正常工作: T GetRowVal<T>(System.Data.DataRow dr, string fieldName) { var type=typeof(T); var val = dr[fieldName]; if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))

我想让以下功能正常工作:

    T GetRowVal<T>(System.Data.DataRow dr, string fieldName)
    {
        var type=typeof(T);
        var val = dr[fieldName];
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
            if (val == DBNull.Value || val == null) return null;
        return (T)val;
    }
T GetRowVal(System.Data.DataRow dr,字符串字段名)
{
var类型=类型(T);
var val=dr[fieldName];
if(type.IsGenericType&&type.GetGenericTypeDefinition()==typeof(可为空))
if(val==DBNull.Value | | val==null)返回null;
返回(T)val;
}
当然,没有对T类型的约束,即使在这种情况下应该允许,它也不希望返回null。 如何更正此函数?(或者如果有更好的方法,请告诉我)


就我所知,我将使用以下方法:

    T GetRowVal<T>(System.Data.DataRow dr, string fieldName)
    {
        var type=typeof(T);
        var val = dr[fieldName];
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
            if (val == DBNull.Value || val == null) return default(T);
        return (T)val;
    }
T GetRowVal(System.Data.DataRow dr,字符串字段名)
{
var类型=类型(T);
var val=dr[fieldName];
if(type.IsGenericType&&type.GetGenericTypeDefinition()==typeof(可为空))
if(val==DBNull.Value | | val==null)返回默认值(T);
返回(T)val;
}

新解决方案:)

返回dr.Field(fieldName);
不确定它的性能是否更好,但可能看起来更干净

可以在MS Github上找到实现:


您唯一的选择是
返回默认值(T)

我发现了一个类似的问题,这里的回答似乎很好:

Nullable GetRowVal(System.Data.DataRow dr,字符串字段名)

因为签名可以工作。

问题是,如果类型不可为null,则需要在之后强制转换或调用.Value。
return dr.Field<T>(fieldName);
Nullable<T> GetRowVal<T>(System.Data.DataRow dr, string fieldName)