我有一系列的扩展方法来帮助对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 NullableGetNullable (this IDataRecord dr, int ordinal) { Nullable nullValue = null; return dr.IsDBNull(ordinal) ? nullValue : (Nullable ) dr.GetValue(ordinal); }
只要T是值类型,它就可以工作,但如果T是引用类型,它就不会.
如果T是值类型,则此方法需要返回Nullable类型,否则返回default(T).我该如何实现这种行为?
您可以像这样声明您的方法:
public static T GetNullable(this IDataRecord dr, int ordinal) { return dr.IsDBNull(ordinal) ? default(T) : (T) dr.GetValue(ordinal); }
这样,如果T是可空的int或任何其他可以为null的值类型,它实际上将返回null.如果它是常规数据类型,它将只返回该类型的默认值.