我有一系列扩展方法来帮助对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);
}
依此类推,对于我需要处理的每种类型。
我想将它们重新实现为通用方法,部分是为了减少冗余,部分是学习如何编写通用方法。
我写了这个:
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);
}
只要T是值类型,它就起作用,但是如果T是引用类型,则不会。
如果T是值类型,则此方法将需要返回Nullable类型,否则将返回default(T)。我将如何实现此行为?
最佳答案
您可以像这样声明您的方法:
public static T GetNullable<T>(this IDataRecord dr, int ordinal)
{
return dr.IsDBNull(ordinal) ? default(T) : (T) dr.GetValue(ordinal);
}
这样,如果T是可为null的int或任何其他可为null的值类型,则它实际上将返回null。如果它是常规数据类型,它将仅返回该类型的默认值。