2014-01-21 53 views
0

检查通用类型的空值

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

在这里,我已经尝试过。

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段和返回值的垃圾。

有谁能告诉我上面的函数有什么问题。

+3

'Int'和'DateTime'是不可空的。他们不可能*为空。你将一个空字符串转换为任何其他任意类型'T'也是非常不可能成功的。世界上大多数类型都没有实现'IConvertable'。当你调用'ToString'时,任何'null'都会引发异常。 – Servy

回答

0

String.IsNullOrEmpty(obj.ToString())很少会变成true。我唯一能想到的将会生成一个空字符串vi ToString()是另一个空字符串。事实上,除非ToString()已被覆盖(如它一直是原生类型,如DateTimeint,你会得到对象的全名。

也许你想

if (obj == default(T)) 

+0

在这种情况下,我应该如何检查int和datetime的空值 – Abbas

+0

@Abbas'int'和'DateTime' _cannot_为null。 –

+0

'if(obj == default(T))'会将一个日期的DateTime.MinValue变成DateTime.Now。如果他真的想要最短日期值,毕竟它们不是空的呢? – Servy

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" 

如果第一个操作数的类型不为空,那么??操作符甚至不会编译。