当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Generic方法可以同时处理Reference和NullableValue类型吗?》经验,为你挑选了1个好方法。

我有一系列的扩展方法来帮助对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 GetNullable(this IDataRecord dr, int ordinal)
{
    Nullable nullValue = null;
    return dr.IsDBNull(ordinal) ? nullValue : (Nullable) dr.GetValue(ordinal);
}

只要T是值类型,它就可以工作,但如果T是引用类型,它就不会.

如果T是值类型,则此方法需要返回Nullable类型,否则返回default(T).我该如何实现这种行为?



1> BFree..:

您可以像这样声明您的方法:

public static T GetNullable(this IDataRecord dr, int ordinal)
{
    return dr.IsDBNull(ordinal) ? default(T) : (T) dr.GetValue(ordinal);
}

这样,如果T是可空的int或任何其他可以为null的值类型,它实际上将返回null.如果它是常规数据类型,它将只返回该类型的默认值.


如果数据库中的值可以为空,那么T将是Nullable ,在这种情况下,NULL是将返回的默认值.
这是非常糟糕的解决方案.如果在datarecord NULL值中,则不需要默认值int.NULL和ZERO是不同的值.
如果是这样,为什么这个扩展方法,如果你可以简单地使用"dr [ordinal] as int?" ?
@juan这似乎是一个非常多余的错误.我在这一点上不同意FxCop - 明确说明泛型方法的类型并不是坏事.
推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有