14

我试图让它工作,但不知何故它失控了......我希望能够检查我分配的任何类型的 null 或空。

前任:

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 

 }

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

4

5 回答 5

30
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
于 2013-05-15T09:16:03.617 回答
2

你可以对照一下default(T);

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

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

于 2013-05-15T09:13:00.200 回答
1

您可以使用 default() -

例如:

if(value != default(T))

来自 MSDN:

给定参数化类型 T 的变量 t,语句 t = null 仅在 T 是引用类型且 t = 0 仅适用于数值类型而不适用于结构时才有效。解决方案是使用 default 关键字,它将为引用类型返回 null,而为数值类型返回零。对于结构,它将返回结构的每个成员,根据它们是值类型还是引用类型,初始化为零或空。

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

于 2013-05-15T09:10:44.893 回答
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);
于 2013-05-15T09:12:47.083 回答
0
我添加了一些重构:

 1. DBNull 不被视为 isnullorempty 所以添加了(值作为字符串)
 2. 传递在运行时动态创建的数据表 row[column](例如:row["PropertyName"])不会将其视为带有 typeof(T) 的字符串,因为列类型基是对象。因此添加了对 typeof(object) 的额外检查,如果不是 null 则测试 ToString() 为空值。我尚未对此进行全面测试,因此可能不适用于所有类型的数据列。
  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));
  }
于 2017-11-07T19:32:01.790 回答