如何从泛型类型中仅获取类型名称?——以Nullable<DateTime>为例
如何从Nullable类型中获取"DateTime"字符串?
这个问题我之前也碰到过!因为Nullable<T>本质是个泛型结构体,直接调用type.Name会返回Nullable'1,type.FullName会返回带完整泛型参数签名的长字符串,完全不是你想要的结果。
别急,.NET已经给我们提供了专门处理Nullable类型的方法,不用自己去解析字符串(手动解析很容易因为格式变动出错),具体做法如下:
核心解决方案:使用Nullable.GetUnderlyingType方法
这个方法会直接返回Nullable类型的基础类型,如果传入的不是Nullable类型,就返回null。我们可以利用它来拿到DateTime的类型名称:
// 假设你的type是Nullable<DateTime>的Type对象 Type type = typeof(DateTime?); Type underlyingType = Nullable.GetUnderlyingType(type); // 用空合并运算符处理非Nullable类型的情况 string targetName = underlyingType?.Name ?? type.Name; // 此时targetName就是"DateTime"
实际场景示例(比如反射获取属性类型)
如果是通过反射拿到某个属性的类型(比如属性是DateTime?),同样可以用这个方法:
// 假设你有一个包含Nullable<DateTime>属性的对象 var myObject = new { MyNullableDate = (DateTime?)DateTime.Now }; PropertyInfo propInfo = myObject.GetType().GetProperty("MyNullableDate"); Type propType = propInfo.PropertyType; Type underlyingType = Nullable.GetUnderlyingType(propType); if (underlyingType != null) { Console.WriteLine(underlyingType.Name); // 输出:DateTime }
为什么不推荐手动解析字符串?
比如你尝试从FullName里截取[[和]]之间的内容,看起来能行,但如果遇到其他泛型类型或者不同版本的.NET,字符串格式可能会有变化,稳定性远不如官方提供的Nullable.GetUnderlyingType方法。
内容的提问来源于stack exchange,提问作者Green_qaue
相关产品推荐
相关产品推荐

