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

Dom*_*ius 4 c# types nullable

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

"System.DateTime?"
Run Code Online (Sandbox Code Playgroud)

或者

"int?"
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sco*_*nen 5

我缺少上下文的一部分 - 例如,字符串是否总是表示可为空的值类型?

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

var valueType = Type.GetType("System.DateTime");
var nullableType = typeof(Nullable<>).MakeGenericType(valueType);
Run Code Online (Sandbox Code Playgroud)

这应该可以解决部分问题。更难的部分是从字符串中确定底层类型,这取决于您收到的输入类型。从 获取类型很容易System.DateTime,但从int. 这个答案可能对那部分有所帮助。


至于输入 - 是否有任何选项可以为用户提供可用选项列表,以便您收到的输入始终是有效的类型名称?这将否定对任何这些的需要。那你就可以了Type.GetType(stringWithTypeName)


Ofi*_*ten 5

除了斯科特的答案之外,您还可以使用Type.GetType正确的名称:

System.Nullable`1[System.DateTime]
Run Code Online (Sandbox Code Playgroud)

所以这个函数将为你返回正确的类型。

public Type GetType(string typeString)
{
    if (typeString.EndsWith("?"))
    {
        typeString = $"System.Nullable`1[{typeString.TrimEnd('?')}]";
    }
    return Type.GetType(typeString);
}
Run Code Online (Sandbox Code Playgroud)