区分对象的类型是 DateTime 还是 Nullable<DateTime>(DateTime?)

问题描述 投票:0回答:2

如何区分对象的类型是 DateTime 还是 NullableDateTime> (DateTime?)?

我明白为什么下面的代码不起作用,但是你能帮我找到一个能起作用的解决方案吗?

    public void Test()
    {
        DateTime? dateTime1 = new DateTime(2020, 1, 1);
        DateTime dateTime2 = new DateTime(2020, 1, 1);
        DoSomething(dateTime1);
        DoSomething(dateTime2);
    }

    public void DoSomething(object value)
    {
        if (value is DateTime?)
        {
            //Do something
        }
        if (value is DateTime)
        {
            //Do something else
        }
    }
c# datetime compare nullable
2个回答
2
投票

这是不可能的,因为 nullabale 值类型在 C# 中是 boxed 的:

  • 如果 HasValue 返回 false,则生成空引用。
  • 如果 HasValue 返回 true,则将底层值类型 T 的对应值装箱,而不是 Nullable 的实例。

所以基本上不存在装箱可为空值类型之类的东西。

不确定您的实际情况,但在提供的场景中,您可以使您的方法通用并使用

Nullable.GetUnderlyingType

public void DoSomething<T>(T value)
{
    var typeOfT = typeof(T);
    if(Nullable.GetUnderlyingType(typeOfT) == typeof(DateTime))
    {
        Console.WriteLine("nullable dt");
    }
    else if(typeOfT ==  typeof(DateTime))
    {
        Console.WriteLine("dt");
    }
}

DoSomething(dateTime1); // prints "nullable dt"
DoSomething(dateTime2); // prints "dt"

-1
投票
      public void Test()
      (
        DateTime? dateTime1 = new DateTime(2020, 1, 1); 
        DateTime dateTime2 = new DateTime(2020, 1, 1);
        DateTime? dateTime3 = DateTime.Now;
        DateTime dateTime4 = DateTime.Now.Date;

        **//here you can pass any datetime variable from above**
        DoSomething(dateTime1 == null ? null : dateTime1);
        DoSomething(dateTime2);
       }

   
   public void DoSomething(DateTime? value)
    {
        if (DateTime.TryParse(value.ToString(), out DateTime Temp) == true  && value != null)
        {
            //do stuff if dateTime variable not null & correct formate
            var d = value;
        }
        else
        {
            //do stuff if dateTime variable null
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.