我有一系列扩展方法来帮助对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。如果它是常规数据类型,它将仅返回该类型的默认值。

10-04 09:57