对于任何类型(如int,string,double)检查null或empty的通用方法

时间:2013-05-15 09:06:50

标签: c# generics

我正在努力让这个工作,但不知怎的,它从我的手......我希望能够检查null或空到我指定的任何类型。

EX:

int i =0;
string mystring = "";

var reult  = CheckNullOrEmpty(10) // passing int
var result 1  = CheckNullOrEmpty(mystring) // passing string 

 public bool CheckNullOrEmpty<T>(T value)
 {
    // check for null or empty for strings
    // check for null i.e. 0 for int 

 }

有人可以帮我解决这个问题。我试图了解泛型如何适用于这个简单的方法。

5 个答案:

答案 0 :(得分:25)

public static bool CheckNullOrEmpty<T>(T value)
{
     if (typeof(T) == typeof(string))
        return string.IsNullOrEmpty(value as string);

     return value == null || value.Equals(default(T));
}

使用方法:

class Stub { }

bool f1 = CheckNullOrEmpty(""); //true
bool f2 = CheckNullOrEmpty<string>(null); //true
bool f3 = CheckNullOrEmpty(0); //true
bool f4 = CheckNullOrEmpty<Stub>(null);  //true

答案 1 :(得分:2)

您可以查看default(T);

 public bool CheckNullOrEmpty<T>(T value)
 {
      return value == default(T);
 }

了解更多信息:http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx

答案 2 :(得分:1)

您可以使用默认值() -

e.g:

if(value != default(T))
来自MSDN的

  

给定参数化类型T的变量t,语句t = null   仅当T是引用类型且t = 0才有效时才有效   数值类型,但不适用于结构。解决方案是使用   default关键字,它将为引用类型返回null并为零   对于数值类型。对于结构,它将返回每个成员   struct初始化为零或null,具体取决于它们是否为   价值或参考类型。

http://msdn.microsoft.com/en-us/library/xwth0h0d(v=vs.80).aspx

答案 3 :(得分:1)

由于您的CheckNullOrEmpty实现因类型而异,因此您无法将该检查作为通用函数。

但是,如果您使用Nullable值类型,则可以使用GetValueOrDefault()

int? i = 0;

var result = i.GetValueOrDefault(10);

然后对于string,只需要一个扩展方法:

public static string GetValueOrDefault(this string item, string defaultValue = "")
{
    return !string.IsNullOrWhiteSpace(item) ? item : defaultValue;
}

然后你可以这样做:

string i = null;
string mystring = "";

var result  = i.GetValueOrDefault(mystring);

答案 4 :(得分:0)

I've added a couple of re-factorings:

 1. DBNull is not seen as isnullorempty so added the (value as string)
 2. Passing a datatable row[column] that was created dynamically at runtime (like: row["PropertyName"]) will not see this as a string with typeof(T) due to the fact that the column type base is object. So added an extra check for typeof(object) and if not null test that the ToString() is empty value. I haven't tested this fully so may not work for all types of data columns.
  public static bool CheckNullOrEmpty<T>(T value)
  {
        // note: this does not see DBNull as isnullorempty.  
        if (typeof(T) == typeof(string))
        {
            if (!string.IsNullOrEmpty(value as string))
            {
                return string.IsNullOrEmpty(value.ToString().Trim());
            }
            else
            {
                return true;
            }
        }
        else if (typeof(T) == typeof(object))
        {
            // note: datatable columns are always seen as object at runtime with generic T regardless of how they are dynamically typed?
            if (value != null) {
                return string.IsNullOrEmpty(value.ToString().Trim());
            }
        }


      return value == null || value.Equals(default(T));
  }