2012-03-21 37 views
108

有沒有辦法讓這個方法是通用的,所以我可以返回一個字符串,布爾,整型或雙?現在,它返回一個字符串,但是如果它能夠找到「true」或「false」作爲配置值,我想返回一個布爾例如。如何使通用方法的返回類型?

public static string ConfigSetting(string settingName) 
    { 
     return ConfigurationManager.AppSettings[settingName]; 
    } 
+0

是有你知道的方式每種設置是什麼類型? – thecoshman 2012-03-21 15:45:44

+2

我認爲你真正想問的問題是「如何使我的應用程序配置強制類型化?」儘管如此,我還是花了很長時間才寫出了正確的答案。 – Simon 2012-03-21 15:53:17

+0

是的,理想情況下,我不想將該類型傳入方法。我只會有我提到的4種類型。所以如果設置了「true」/「false」,我希望這個函數返回一個布爾值(不需要將它傳遞給方法),我可以將int和double組合成double,其他的都是字符串。已經回答的問題可以正常工作,但我需要每次都通過該類型,這可能很好。 – MacGyver 2012-03-21 16:26:04

回答

234

你需要使它成爲一個通用的方法,如:

public static T ConfigSetting<T>(string settingName) 
{ 
    return /* code to convert the setting to T... */ 
} 

呼叫者必須指定他們所期望的類型。然後,您可能使用Convert.ChangeType,假設所有相關類型的支持:

public static T ConfigSetting<T>(string settingName) 
{ 
    object value = ConfigurationManager.AppSettings[settingName]; 
    return (T) Convert.ChangeType(value, typeof(T)); 
} 

我並不完全相信,這一切都是一個好主意,你要知道...

+10

/*將設置轉換爲T ... * /的代碼,下面是整個小說:) – 2012-03-21 15:47:05

+1

這不需要您知道您希望獲得的設置的類型,這可能是不可能的。 – thecoshman 2012-03-21 15:47:31

+0

@thecoshman:那麼OP *請求了一個通用的方法,所以這就是我給出的 - 但有一個告誡,調用者*將*需要知道相關類型。 – 2012-03-21 15:48:29

20

你可以使用Convert.ChangeType()

public static T ConfigSetting<T>(string settingName) 
{ 
    return (T)Convert.ChangeType(ConfigurationManager.AppSettings[settingName], typeof(T)); 
} 
-1
private static T[] prepareArray<T>(T[] arrayToCopy, T value) 
    { 
     Array.Copy(arrayToCopy, 1, arrayToCopy, 0, arrayToCopy.Length - 1); 
     arrayToCopy[arrayToCopy.Length - 1] = value; 
     return (T[])arrayToCopy; 
    } 

我在我的代碼執行此,想辦法把它變成一個方法。我想在此分享,因爲我不必爲我的返回值使用Convert.ChangeType。這可能不是最佳做法,但它對我有用。此方法接受一個通用類型的數組和一個值以添加到數組的末尾。然後將該數組與第一個數據值進行剝離並將取入該方法的值添加到數組的末尾。最後一件事是我返回泛型數組。

0

有1 /直做法這樣做的許多方面(按優先級上市,具體到OP的問題)

  1. 選項 - 每種類型創建多個功能,您期望,而不是一個普通的功能。

    public static bool ConfigSettingInt(string settingName) 
    { 
        return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]); 
    } 
    
  2. 選項2 /當你不想使用轉換花式方法 - 轉換成對象的值,然後對一般類型。

    public static T ConfigSetting<T>(string settingName) 
    { 
        return (T)(object)ConfigurationManager.AppSettings[settingName]; 
    } 
    

    注 -如果轉換是無效的(你的情況),這將拋出一個錯誤。我不建議這樣做,如果你不能確定的類型轉換,而不是去選擇3.

  3. 選項3 /通用型安全 - 創建一個通用的函數來處理類型轉換。

    ​​

    注 - T是預期的類型,請注意其中的約束這裏(U的類型必須是IConvertible我們從錯誤中保存)

+0

爲什麼第三個選項在'U'中是通用的?這樣做沒有意義,而且會使方法更難調用。只需接受'IConvertible'。考慮到它不回答被問到的問題,我認爲不值得包括這個問題的第二個選項。您應該也可以在第一個選項中重命名該方法... – 2017-12-13 07:05:16

相關問題