Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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# 将泛型类与SqlDataReader GetValue一起使用_C#_Generics_Sqldatareader - Fatal编程技术网

C# 将泛型类与SqlDataReader GetValue一起使用

C# 将泛型类与SqlDataReader GetValue一起使用,c#,generics,sqldatareader,C#,Generics,Sqldatareader,我有这段代码,可以在没有空值的数据库中正常工作 public T GetField<T>(SqlDataReader dr, string fieldName) { return (T)dr.GetValue(dr.GetOrdinal(fieldName)); } 然后我想控制DBNull值,因为它们已经存在于一些表中,我对函数进行了如下升级: public T GetField<T>(SqlDataReader dr, string fieldName) w

我有这段代码,可以在没有空值的数据库中正常工作

public T GetField<T>(SqlDataReader dr, string fieldName)
{
    return (T)dr.GetValue(dr.GetOrdinal(fieldName));
}
然后我想控制DBNull值,因为它们已经存在于一些表中,我对函数进行了如下升级:

public T GetField<T>(SqlDataReader dr, string fieldName) where T : new()
{
    var value = dr.GetValue(dr.GetOrdinal(fieldName));   
    return value is DBNull ? new T() : (T)value;
}
但现在,我无法请求GetField,因为string没有包含0个参数的构造函数

我曾尝试创建另一个类似于抽象函数的函数,没有任何限制,只使用这样的字符串类型

public string GetField<string>(SqlDataReader dr, string fieldName)
{
    var value = dr.GetValue(dr.GetOrdinal(fieldName));   
    return value is DBNull ? "" : value.ToString();
}
但答案是它们是模糊的定义,因为T也包括字符串,即使应用了限制

我可以为每种数据类型创建独立的函数,但我更喜欢抽象解决方案,因为它要干净得多

我错过什么了吗


谢谢

最后一个方法将失败,因为它试图声明一个名为string的类型参数

我建议您添加另一个重载,该重载不受T的约束,但具有默认值:

public T GetField<T>(SqlDataReader dr, string fieldName, T defaultValue)
{
    var value = dr.GetValue(dr.GetOrdinal(fieldName));   
    return value is DBNull ? defaultValue : (T) value;
}

。。。还有一个好处是,该方法不是特定于字符串的。

您的最终方法将失败,因为它试图声明一个名为string的类型参数

我建议您添加另一个重载,该重载不受T的约束,但具有默认值:

public T GetField<T>(SqlDataReader dr, string fieldName, T defaultValue)
{
    var value = dr.GetValue(dr.GetOrdinal(fieldName));   
    return value is DBNull ? defaultValue : (T) value;
}
。。。还有一个好处是该方法不是特定于字符串的。

这里有一种方法:

public T GetField<T>(SqlDataReader dr, string fieldName)
{
    var value = dr.GetValue(dr.GetOrdinal(fieldName));
    return value is DBNull ? default(T) : (T) value;
}
使用可为空的类型具有额外的好处。那么你可以称之为:

string x = foo.GetField<string>(reader, "field") ?? "";
在本例中,这是故意设计的-如果您通常希望返回null以外的内容,Jon的带有默认值的版本更适合您。

这里有一种方法:

public T GetField<T>(SqlDataReader dr, string fieldName)
{
    var value = dr.GetValue(dr.GetOrdinal(fieldName));
    return value is DBNull ? default(T) : (T) value;
}
使用可为空的类型具有额外的好处。那么你可以称之为:

string x = foo.GetField<string>(reader, "field") ?? "";

在本例中,这是故意设计的-如果您通常希望返回null以外的值,那么Jon的带有默认值的版本更适合您。

不清楚您所说的另一个函数(如抽象函数)是什么意思-哪个抽象什么?您还没有显示任何抽象方法或类。。。你是说普通的吗?泛型和抽象在C语言中的意思是非常不同的。是的,你是对的,我的意思是泛型。它不清楚你所说的另一个函数,比如抽象函数,是什么意思-哪个抽象什么?您还没有显示任何抽象方法或类。。。你是说普通的吗?泛型和抽象在C语言中的意思非常不同。是的,你是对的,我的意思是Generic@JeroenMostert:是的,已修复。默认值是一个很好的功能,我已经包含了它,谢谢@JeroenMostert:是的,修正了。默认值是一个很好的特性,我已经包括了它,谢谢!那正是我要找的。混合使用这两种解决方案使我能够灵活地回答所有场景。非常感谢!那正是我要找的。混合使用这两种解决方案使我能够灵活地回答所有场景。非常感谢!