从类型名称获取可空类型

Get a nullable type from a type name

我有以下情况,我得到一个如下所示的字符串

"System.DateTime?"

"int?"

我想做的是检索该字符串的 System.Type,它看起来像:

{Name = "Nullable1" FullName = "System.Nullable1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}

现在我知道如何从字符串中检索类型我可以在处理不可为空的类型时说 Type.GetType("System.DateTime") 或在我知道它将是 DateTime 可为空的类型时说 typeof(DateTime?) ,但是在这个例如,我不知道可能会出现什么可空类型,并且只会将其作为字符串接收。

我遗漏了部分上下文 - 例如,字符串是否始终表示可为 null 的值类型?

鉴于您可以从字符串中提取值类型名称并创建对该类型的引用:

var valueType = Type.GetType("System.DateTime");
var nullableType = typeof(Nullable<>).MakeGenericType(valueType);

这应该可以解决部分问题。较难的部分是根据字符串确定基础类型,这取决于您接收的输入类型。从 System.DateTime 获取类型很容易,但从 int 获取类型就难了。 This answer 可能对这部分有帮助。


就输入而言 - 是否有任何选项可以向用户提供可用选项列表,以便您收到的输入始终是有效的类型名称?这将否定任何这些的需要。然后你可以做 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" 创建一个扩展方法,并执行该方法以检查它是否为可空类型以及 return 是否为正确的类型。以下示例:

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?");