我有以下场景,我得到一个如下所示的字符串
"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可以为空时,但在这个例子中我我不知道可以通过什么类型的可空类型,只会将其作为字符串接收。
答案 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?");