C# IsNull()扩展,用于检查任何对象的null值

C# IsNull()扩展,用于检查任何对象的null值,c#,.net,null,extension-methods,C#,.net,Null,Extension Methods,我正在添加新方法,用于根据以下条件检查任何对象的值: 如果类对象的值为null,则应返回true 如果对象的类型为string且具有值,则应返回true 如果对象的类型为DateTime且具有,则应返回true。 需要检查空值的任何其他条件。如果需要,请提出建议。 以下是IsNull扩展方法: public static bool IsNull(this object obj) { if (obj == null || obj == DBNull.Value) re

我正在添加新方法,用于根据以下条件检查任何对象的值:

如果类对象的值为null,则应返回true 如果对象的类型为string且具有值,则应返回true 如果对象的类型为DateTime且具有,则应返回true。 需要检查空值的任何其他条件。如果需要,请提出建议。 以下是IsNull扩展方法:

 public static bool IsNull(this object obj)
 {
     if (obj == null || obj == DBNull.Value)
        return true;

     if (obj.GetType() == typeof(string))
        return string.IsNullOrEmpty(obj.ToString());

     if (obj.GetType() == typeof(DateTime))
     {
        DateTime _dateValue = DateTime.MinValue;

        if (DateTime.TryParse(obj.ToString(), out _dateValue) && _dateValue == DateTime.MinValue)
        return true;
     }

     return false;
 }
现在我的问题是:

我是否需要为值和引用类型添加不同的检查 对象 此扩展方法是否处理所有类型的空检查 对象 是否需要在扩展中添加任何建议或改进? 一些意见:

1值类型永远不会为空。在值类型上调用时。。它将被装箱到一个对象上。。并且不会为null,除非将其包装为null

2您的方法不再检查null。。它还检查最小值和空字符串。空字符串不是null-它是空值。最小值不为空。。这是一种价值。它在这里的责任太大,应该重新命名

3.考虑到我上面所说的。。您可以简单地执行此操作,而不是编写自己的函数:

if (variable == default(variable.GetType()))
因为这会检查所有类型的默认值。。值类型,如DateTime、int和null类。然后,您唯一的其他特定检查是DBNull.Value

是否需要为值和引用类型对象添加检查差异

值类型不能为null

此externtion方法是否处理任何对象的所有类型的空检查

看起来除了值类型之外

是否需要在扩展中添加任何建议或改进

正如我所说的值类型不能为null,因此您可以添加一个额外的条件来检查该类型是否为值类型,如果是这样,您可以返回false


顺便说一句,如果您在日期时间检查之前写入此项,您的日期时间条件将变得不可访问。这没有任何意义,但这是您的选择。如果您希望在值等于DateTime.MinValue时返回true,则完全由您决定。

我不明白。你正在写一个扩展,你需要我们告诉你它应该做什么?那你为什么要写呢?顺便说一句,string.Empty是一个空字符串,不为null,DateTime.Min!=也可以为空。我真的不明白你为什么需要这种方法。如果你想要扩展方法根据类型的不同而不同,那么就在这些类型上编写扩展方法。对于代码审查goto@MarcinJuraszek Yes,你可以说该方法不是用于检查null,而是用于特定对象typestring的最小要求,DateTime。请保留null的用法以表示。当您指的是其他内容时,请对其进行限定:。当你想把它和其他意思结合起来时,可以使用连词:and.Yeah,它将返回IsNull0作为true。非常好而且有用的方法。@MarcinJuraszek它与DateTime.MinValue.IsNull和String.Empty.IsNull一样有用,返回true。null的第三个和第四个定义是0,因此可能在某种程度上是有效的。。。在非常具体的场景中@charlieparker:数学。使用此方法编写代码时。。这毫无意义。@SimonWhitehead只是在玩devil's advocateValue类型可能会像int?一样为空,在这种情况下它应该返回true@AnkushMadankar-您可以有可为空的值类型,但无法将它们传递到此接受对象的函数中。它不会编译。@ansible不正确。是的。。它将传递null。@ansible代码将编译,但我认为如果obj==null | | obj==DBNull.Value将处理可为null的值类型..@SimonWhitehead-有趣-我需要明天在我的PC上尝试一下。
if(obj.GetType().IsValueType) return false;