繁体   English   中英

从类型名称获取可为空的类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM