区分对象是 DateTime 类型还是 Nullable<DateTime> (DateTime?)
Differentiate if an object is of type DateTime or Nullable<DateTime> (DateTime?)
如何区分对象是 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# 中的可空值类型 boxed:
- If HasValue returns false, the null reference is produced.
- If HasValue returns true, the corresponding value of the underlying value type T is boxed, not the instance of 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(dateTime1); // prints "dt"
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
}
}
如何区分对象是 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# 中的可空值类型 boxed:
- If HasValue returns false, the null reference is produced.
- If HasValue returns true, the corresponding value of the underlying value type T is boxed, not the instance of 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(dateTime1); // prints "dt"
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
}
}