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