2012-03-21 11 views
108

Czy istnieje sposób, aby ta metoda była ogólna, więc mogę zwrócić ciąg, bool, int lub double? W tej chwili zwraca ciąg znaków, ale jeśli jest w stanie znaleźć "true" lub "false" jako wartość konfiguracji, chciałbym na przykład zwrócić wartość bool.Jak utworzyć typ powrotu dla metody ogólnej?

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

Czy istnieje sposób, aby wiedzieć, jaki typ są poszczególne ustawienia? – thecoshman

+2

Myślę, że pytanie, które naprawdę chcesz zadać, brzmi: "W jaki sposób mogę napisać moją aplikację config?" Zbyt długo jednak pracowałem nad tym, by napisać właściwą odpowiedź. – Simon

+0

Yah, najlepiej nie chcę przekazywać typu do metody. Będę miał tylko 4 typy, o których wspomniałem. Więc jeśli ustawione jest "true"/"false", chcę, aby ta funkcja zwróciła wartość boolean (bez potrzeby przekazywania jej do metody), prawdopodobnie mogę połączyć int i double w podwójne, a wszystko inne powinno być ciągiem. To, na co już udzielono odpowiedzi, będzie działało dobrze, ale za każdym razem muszę przekazywać ten typ, co prawdopodobnie jest w porządku. – MacGyver

Odpowiedz

234

Musisz zrobić to metoda rodzajowa, tak:

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

Ale rozmówca będą musiały określić rodzaj ich spodziewać. Można następnie potencjalnie wykorzystać Convert.ChangeType, zakładając, że obsługiwane są wszystkie istotne rodzaje:

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

Nie jestem do końca przekonany, że wszystko to jest dobry pomysł, pamiętajcie ...

+10

/* kod do przekonwertowania ustawienia na T ... */i tutaj następuje cała powieść :) –

+1

Czy to nie wymagałoby poznania typu ustawienia, które chcesz uzyskać, co może nie być możliwe. – thecoshman

+0

@thecoshman: Cóż, OP * zażądał * ogólnej metody, więc to jest to, co podałem - ale z zastrzeżeniem, że osoba dzwoniąca * będzie musiała * znać odpowiedni typ. –

20

Można użyć 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; 
    } 

Wykonywałem to całym moim kodu i chciał sposób, aby umieścić go w metodzie. Chciałem to udostępnić tutaj, ponieważ nie musiałem używać Convert.ChangeType dla mojej wartości zwracanej. To może nie być najlepsza praktyka, ale zadziałało to dla mnie. Ta metoda pobiera tablicę typów ogólnych i wartość do dodania do końca tablicy. Tablica jest następnie kopiowana z pierwszą wartością usuniętą, a wartość dodana do metody jest dodawana na końcu tablicy. Ostatnią rzeczą jest to, że zwracam ogólną tablicę.

0

Istnieje wiele sposobów, aby to zrobić (wymienione według priorytetu, specyficzne dla problemu PO za)

  1. Wariant 1/Prosto podejście - Tworzenie wielu funkcji dla każdego typu można oczekiwać zamiast jednego rodzajowego funkcjonować.

    public static bool ConfigSettingInt(string settingName) 
    { 
        return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]); 
    } 
    
  2. Opcja 2/Jeśli nie chcesz używać fantazyjne metody konwersji - Obsada wartość na obiekt, a następnie do typu rodzajowego.

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

    Uwaga - To wygeneruje błąd, jeśli obsada nie jest ważna (sprawa). Nie polecam to zrobić, jeśli nie jesteś pewien co do odlewania typu, raczej iść do opcji 3.

  3. Wariant 3/Generic z bezpieczeństwem typu - Tworzenie rodzajowe funkcji do obsługi konwersji typu.

    public static T ConvertValue<T,U>(U value) where U : IConvertible 
    { 
        return (T)Convert.ChangeType(value, typeof(T)); 
    } 
    

    Uwaga - T jest spodziewany typ, zanotować gdzie ograniczenie tutaj (typ U musi być IConvertible uratować nas przed błędami)

+0

Dlaczego trzecia opcja jest generyczna w 'U'? Nie ma sensu robić tego, a to sprawia, że ​​metoda jest trudniejsza do wywołania. Po prostu zaakceptuj "IConvertible" zamiast. Nie sądzę, że warto uwzględnić drugą opcję tego pytania, ponieważ nie odpowiada na zadawane pytanie. Powinieneś prawdopodobnie zmienić nazwę metody w pierwszej opcji ... –

Powiązane problemy