泛型检查为null,不是默认值(T)

时间:2014-07-22 14:49:39

标签: c# .net json generics

如何确定泛型方法的值是否为空?所以我发现的唯一方法是检查它是否为类,并且它具有默认值。所以我的代码:

    public static string AsJsonArray<T>(this IEnumerable<T> collection)
    {
        var sb = new StringBuilder("[");
        var enumerator = collection.GetEnumerator();
        bool isClass = typeof (T).IsClass;
        if (enumerator.MoveNext())
        {
            if (isClass && enumerator.Current == default(T))
                sb.Append("null");
            else 
                sb.Append(enumerator.Current);
            while (enumerator.MoveNext())
            {
                sb.Append(", ");
                if (isClass && enumerator.Current == default(T))
                    sb.Append("null");
                else
                    sb.Append(enumerator.Current);
            }
        }

        var asJsonArray = sb.Append("]").ToString();
        return asJsonArray;
    }

但我对这种丑陋的反思检查isClass && enumerator.Current == default(T)

感到非常恼火

是否存在其他选择?

2 个答案:

答案 0 :(得分:4)

根据评论提示,请使用==运算符或ReferenceEquals检查。

private static bool IsNull<T>(T item)
{
   return object.ReferenceEquals(null, item);
}

这会产生:

int? nullableInt = null;
Console.WriteLine(IsNull(nullableInt)); //true
object refType = null;
Console.WriteLine(IsNull(refType)); //true
int valueType = 0;
Console.WriteLine(IsNull(valueType)); //false

IsClass Nullable<T>检查失败的Nullablestruct实际上是private static string ToStringOrDefault<T>(T item, string replacement = "null") { return IsNull(item) ? replacement : item.ToString(); } sb.Append(ToStringOrDefault(nullableInt));

要删除重复的代码,您甚至可以创建一个方法来检查null并替换为text:

{{1}}

答案 1 :(得分:3)

听起来你只需要== null

var current = enumerator.Current;
if (current == null)
{
    sb.Append("null");
}
else
{
    sb.Append(current);
}

或更紧凑:

var current = enumerator.Current;
sb.Append(current == null ? (object) "null" : current);

甚至在调用之前装箱,并使用空合并运算符:

object current = enumerator.Current; // Boxes where necessary
sb.Append(current ?? "null");