在以下代码中:
DateTime? dt = DateTime.Now;
MessageBox.Show(dt.GetType().ToString());
消息框显示“System.DateTime”,而不是Nullable<DateTime>
。以下内容也返回false(因为GetType错误):
if (dt.GetType().IsAssignableFrom(typeof(DateTime?)))
...
(顺便说一句,使用DateTime?
或Nullable<DateTime>
并没有什么区别)
在监视窗口中,您有“类型”列显示正确的类型(System.DateTime?)。
在我的代码中,我将dt引用为object
,因此我需要正确地获取基础类型。我怎么能这样做?
答案 0 :(得分:11)
引用MSDN (How to: Identify a Nullable Type):
在Nullable类型上调用GetType 导致拳击操作 当类型是隐式时执行 转换为Object。因此GetType 总是返回一个Type对象 代表基础类型,而不是 Nullable类型。
所以基本上你的代码等于:
DateTime? dt = DateTime.Now;
object box = (object)dt;
Console.Write(box.GetType().ToString());
另外,在MSDN上查看"Boxing Nullable Types"我们读到:
如果对象是非null - 如果 HasValue是真的 - 然后拳击 发生,但只有基础类型 可以为空的对象基于 盒装。拳击非null可空 值类型框的值类型 本身,而不是System.Nullable(Of T) 包装值类型。
这清楚地解释了Nullable<T>.GetType()
答案 1 :(得分:3)
GetType()
使用反射返回一个类型。要确定它是否为可空类型,您需要检查PropertyType
值。
foreach (PropertyInfo pi in dt.GetType().GetProperties())
{
if(pi.PropertyType == typeof(DateTime?))
{
// display nullable info
}
}
答案 2 :(得分:0)
因为如果你写这样的东西:
DateTime? dt = null; Type t = dt.GetType();
这是一个NullReferenceException。