如何根据类型名称获取对应的System.Nullable<T>类型?
获取字符串对应的Nullable类型
如果你的字符串是完整的类型全名(比如你给出的System.Nullable1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]),最简单的方法就是直接用Type.GetType()`,它完全支持解析这种泛型类型格式:
string nullableFullName = "System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"; Type nullableType = Type.GetType(nullableFullName); // 此时 nullableType 等价于 typeof(DateTime?)
这里的Nullable1里的``1表示这是一个带1个泛型参数的类型,方括号内的是具体的泛型参数(包含完整的程序集信息),Type.GetType()可以直接解析这种格式。
如果你的字符串是简化形式(比如只给出Nullable<DateTime>或者你从类型信息字符串里提取出了基础类型名称),可以先获取基础类型,再通过泛型构造来生成Nullable类型:
- 先获取基础类型的
Type对象:
Type baseType = Type.GetType("System.DateTime"); // 或者如果是已知的类型,直接用 typeof(DateTime)
- 用
Nullable<>的泛型定义结合基础类型构造可空类型:
Type nullableType = typeof(Nullable<>).MakeGenericType(baseType);
如果你的原始字符串是类似{Name = "Nullable1" FullName = "..."}这种类型信息的描述字符串,你需要先提取出里面的FullName`值,再用上面的第一种方法:
string typeInfoStr = "{Name = \"Nullable`1\" FullName = \"System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]\"}"; // 截取FullName部分的内容 int start = typeInfoStr.IndexOf("FullName = \"") + "FullName = \"".Length; int end = typeInfoStr.LastIndexOf("\""); string fullName = typeInfoStr.Substring(start, end - start); Type nullableType = Type.GetType(fullName);
注意事项
Type.GetType()如果找不到对应的类型会返回null,记得添加空值检查;- 如果基础类型不在默认的程序集(比如mscorlib)中,需要确保目标程序集已经被加载,或者类型全名要包含完整的程序集信息(就像示例里的
System.DateTime, mscorlib, ...)。
内容的提问来源于stack exchange,提问作者Domitius
相关产品推荐
相关产品推荐

