检查泛型类型的空值

时间:2014-01-21 20:58:08

标签: c# asp.net generic-type-argument generic-function

我想创建一个函数,它将检查参数的值,如果它为null,它应该根据参数的类型设置值,否则它应该只返回值,因为它是。

这是我尝试过的。

public static T ConvertNull<T>(T obj)
{
    if (String.IsNullOrEmpty(obj.ToString()))
    {
        HttpContext.Current.Response.Write("COMING IN");
        if (typeof(T) == typeof(Int32))
        {
            return (T)Convert.ChangeType(0, typeof(T));
        }
        else if (typeof(T) == typeof(DateTime))
        {
            return (T)Convert.ChangeType(DateTime.Now, typeof(T));
        }
        else
        {
            return (T)Convert.ChangeType(String.Empty, typeof(T));
        }
    }
    else
    {
        HttpContext.Current.Response.Write("ELSE");
        return obj;
    }
}

但问题是它总是进入ELSE部分并返回垃圾值。

任何人都可以告诉我上述功能有什么问题。

2 个答案:

答案 0 :(得分:0)

String.IsNullOrEmpty(obj.ToString())很少会成为true。我唯一能想到的就是生成一个空字符串vi ToString()是另一个空字符串。实际上,除非ToString()被覆盖(就像DateTimeint这样的原生类型,否则您将获得该对象的完全限定名称。

也许你想要

if (obj == default(T))

答案 1 :(得分:0)

如果你有一个可以为null的类型,如果它是null,你想要替换为某个值,并且在它不为null的情况下返回现有值,那么现有的运算符就是这样做的, ??运算符:

int? i = null;  //note of course that a non-nullable int cannot be null
int n = i ?? 0; //equals zero

string s = null;
string s2 = s ?? ""; //equals an empty string

string s3 = "hi";
string s4 = s3 ?? ""; //equals "hi"

方便地,??运算符在第一个操作数的类型不可为空的情况下甚至不会编译。