簡體   English   中英

如何在泛型方法中返回指定類型?

[英]How can I return the specified type in generic method?

我想從數據庫中獲取指定的類型值。 這是我的代碼:

public static T Get<T>(string key)
        {
            Databases.Context Context = new Databases.Context();
            var i = Context.Setting.FirstOrDefault(_ => _.Key == key)?.Value;
            if (i == null) {
                return default;
            }
            switch (typeof(T))
            {
                case Type intType when intType == typeof(int):
                    {
                        if (int.TryParse(i, out int Result))
                        {
                            return Result;
                        }
                        else{
                            return default;
                        }
                    }
            }
        }

如上面的代碼,我的部分代碼即將返回int類型的值。 但是VS報錯不能將int轉T,請問如何解決? 謝謝你。

你可以這樣做,你需要轉換為相應的類型。

public static T Get<T>(string key)
{
    
    Databases.Context Context = new Databases.Context();
    var i = Context.Setting.FirstOrDefault(_ => _.Key == key)?.Value;
    if (i == null)
    {
        return default;
    }
    switch (typeof(T))
    {
        case Type intType when intType == typeof(int):
            {
                if (int.TryParse(i, out int Result))
                {
                    return (T)Convert.ChangeType(Result, typeof(T));
                }
                else
                {
                    return default;
                }
            }
    }

    return (T)Convert.ChangeType(default, typeof(T));
}

您必須為不同類型提供不同版本的函數: GetAsIntGetAsString等。

一種常見的模式是在返回字符串的輔助方法中使用共享代碼,然后專門的方法調用TryParse

就像是:

int? GetAsInt(string name) 
{
   var s = GetSetting(name);
  if(string.IsNullOrEmpty(s)) return null;

  if(int.TryParse(s out var i)) return i;

 return null; //or throw

// repeat for uint, long, etc. as needed

您還可以提供Try版本: bool TryGet(string name, out int setting)

您可以將通用類型 T 作為參數傳遞並返回 int,如果這是函數將始終返回的內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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