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

时间:2018-02-13 18:37:37

标签: c# types nullable

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

"System.DateTime?"

"int?"

我希望能够做的是检索该字符串的System.Type,如下所示:

  

{Name =“Nullable 1" FullName = "System.Nullable 1 [[System.DateTime,   mscorlib,版本= 4.0.0.0,文化=中性,   公钥= b77a5c561934e089]]“}

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

3 个答案:

答案 0 :(得分:3)

我错过了上下文的一部分 - 例如,字符串是否总是代表可以为空的值类型?

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

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

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

就输入而言 - 是否有任何选项可以为用户提供可用选项列表,以便您收到的输入始终是有效的类型名称?这将否定任何这一点的必要性。然后你就可以Type.GetType(stringWithTypeName)

答案 1 :(得分:3)

除了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);
}

答案 2 :(得分:0)

解决此问题的一种方法是为类型“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?");