我有一系列的扩展方法来帮助对IDataRecord对象进行空值检查,我目前正在实现这样:
public static int? GetNullableInt32(this IDataRecord dr, int ordinal)
{
int? nullInt = null;
return dr.IsDBNull(ordinal) ? nullInt : dr.GetInt32(ordinal);
}
public static int? GetNullableInt32(this IDataRecord dr, string fieldname)
{
int ordinal = dr.GetOrdinal(fieldname);
return dr.GetNullableInt32(ordinal);
}
Run Code Online (Sandbox Code Playgroud)
等等,对于我需要处理的每种类型.
我想重新实现这些作为通用方法,部分是为了减少冗余,部分是为了学习如何编写通用方法.
我写过:
public static Nullable<T> GetNullable<T>(this IDataRecord dr, int ordinal)
{
Nullable<T> nullValue = null;
return dr.IsDBNull(ordinal) ? nullValue : (Nullable<T>) dr.GetValue(ordinal);
}
Run Code Online (Sandbox Code Playgroud)
只要T是值类型,它就可以工作,但如果T是引用类型,它就不会.
如果T是值类型,则此方法需要返回Nullable类型,否则返回default(T).我该如何实现这种行为?
BFr*_*ree 10
您可以像这样声明您的方法:
public static T GetNullable<T>(this IDataRecord dr, int ordinal)
{
return dr.IsDBNull(ordinal) ? default(T) : (T) dr.GetValue(ordinal);
}
Run Code Online (Sandbox Code Playgroud)
这样,如果T是可空的int或任何其他可以为null的值类型,它实际上将返回null.如果它是常规数据类型,它将只返回该类型的默认值.