簡體   English   中英

從類型名稱獲取可為空的類型

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM