[英]Get a nullable type from a type name
我有以下情况,其中我得到一个字符串,如下所示
"System.DateTime?"
要么
"int?"
我想做的是,检索该字符串的System.Type,如下所示:
{Name =“ Nullable
1" FullName = "System.Nullable
1 [[System.DateTime,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]]}}
现在,我知道了如何从字符串中检索类型,当我处理不可为null的类型时,我只能说Type.GetType("System.DateTime")
,当我知道它将为DateTime可为null时,可以说是typeof(DateTime?)
,但是在此实例我不知道会出现什么可为null的类型,只能将其作为字符串接收。
我缺少上下文的一部分-例如,字符串是否始终表示可为空的值类型?
假设您可以从字符串中提取值类型名称并创建对该类型的引用:
var valueType = Type.GetType("System.DateTime");
var nullableType = typeof(Nullable<>).MakeGenericType(valueType);
那应该解决部分问题。 最难的部分是从字符串中确定基础类型,这取决于您要接收的输入类型。 从System.DateTime
获取类型很容易,但是从int
获取类型则很困难。 这个答案可能对那部分有帮助。
至于输入-是否有任何选项可以向用户提供可用选项列表,以便您收到的输入始终是有效的类型名称? 那将不需要任何这些。 然后,您可以执行Type.GetType(stringWithTypeName)
。
除了Scott的答案外,您还可以使用Type.GetType
和正确的名称:
System.Nullable`1[System.DateTime]
因此,此函数将为您找回正确的类型。
public Type GetType(string typeString)
{
if (typeString.EndsWith("?"))
{
typeString = $"System.Nullable`1[{typeString.TrimEnd('?')}]";
}
return Type.GetType(typeString);
}
解决此问题的一种方法是为类型“ Type”创建扩展方法,并使该方法的实现检查其是否为可空类型并返回正确的类型。 如下示例:
namespace ExtensionMethod
{
public static class MyExtensions
{
public static Type GetNullabeType(this Type t, string typeName)
{
string typeString = typeName;
var typeNonNullabe = Type.GetType(typeString.Replace("?", ""));
if (typeString.Contains("?") && typeNonNullabe != null)
{
return typeof(Nullable<>).MakeGenericType(typeNonNullabe);
}
return t;
}
}
}
之后,只需使用如下扩展方法:
Type t = null;
var type = t.GetNullabeType("System.DateTime?");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.