Generic方法可以同时处理Reference和Nullable Value类型吗?

Ada*_*sek 12 .net c# generics

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

  • 如果数据库中的值可以为空,那么T将是Nullable <int>,在这种情况下,NULL是将返回的默认值. (5认同)
  • 这是非常糟糕的解决方案.如果在datarecord NULL值中,则不需要默认值int.NULL和ZERO是不同的值. (2认同)
  • 如果是这样,为什么这个扩展方法,如果你可以简单地使用"dr [ordinal] as int?" ? (2认同)
  • @juan这似乎是一个非常多余的错误.我在这一点上不同意FxCop - 明确说明泛型方法的类型并不是坏事. (2认同)