Czy istnieje sposób, aby uczynić tę metodę ogólną, aby móc zwracać ciąg, bool, int lub double? W tej chwili zwraca ciąg, ale jeśli może znaleźć „prawda” lub „fałsz” jako wartość konfiguracyjną, chciałbym na przykład zwrócić wartość logiczną.
public static string ConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName];
}
c#
.net
generics
return-type
MacGyver
źródło
źródło
dynamic
słowa kluczowego. Wiąże się to z kosztem wydajności, ale w przypadku odczytu pliku konfiguracyjnego koszt wydajności jest prawie na pewno nieistotny.Odpowiedzi:
Musisz uczynić z tego metodę ogólną, na przykład:
Ale dzwoniący będzie musiał określić typ, którego oczekuje. Możesz wtedy potencjalnie użyć
Convert.ChangeType
, zakładając, że obsługiwane są wszystkie odpowiednie typy:Nie jestem do końca przekonany, że to wszystko jest dobry pomysł, pamiętajcie ...
źródło
ConfigSettingString
,ConfigSettingBool
etc.) ma tę zaletę ciał metod, które będą krótsze, bardziej przejrzyste i lepiej koncentruje .Możesz użyć
Convert.ChangeType()
:źródło
Można to zrobić na wiele sposobów (wymienione według priorytetów, specyficznych dla problemu PO)
Opcja 1: Proste podejście - utwórz wiele funkcji dla każdego oczekiwanego typu zamiast jednej funkcji ogólnej.
Opcja 2: Jeśli nie chcesz używać wymyślnych metod konwersji - prześlij wartość na obiekt, a następnie na typ ogólny.
Uwaga - spowoduje to wyświetlenie błędu, jeśli rzut jest nieprawidłowy (Twój przypadek). Nie polecałbym tego robić, jeśli nie masz pewności co do typu rzutowania, raczej wybierz opcję 3.
Opcja 3: Ogólna z bezpieczeństwem typów - Utwórz funkcję ogólną do obsługi konwersji typów.
Uwaga - T jest typem oczekiwanym, zwróć uwagę na ograniczenie gdzie (typ U musi być IConvertible, aby uchronić nas przed błędami)
źródło
U
? Nie ma sensu tego robić, a to utrudnia wywołanie metody. Po prostu zaakceptujIConvertible
zamiast tego. Myślę, że nie warto uwzględniać drugiej opcji dla tego pytania, ponieważ nie odpowiada ona na zadane pytanie. Prawdopodobnie powinieneś także zmienić nazwę metody w pierwszej opcji ...Musisz przekonwertować typ wartości zwracanej metody na typ Generic, który przekazujesz do metody podczas wywoływania.
Musisz przekazać typ, który można kastować dla wartości zwracanej przez tę metodę.
Jeśli chcesz zwrócić wartość, która nie jest kastowalna do przekazywanego typu ogólnego, być może będziesz musiał zmienić kod lub upewnić się, że przekazujesz typ, który jest kastowalny dla wartości zwracanej metody. Dlatego takie podejście nie jest zalecane.
źródło
return (T)Convert.ChangeType(number, typeof(T));
była dokładnie tym, czego mi brakowało -Utwórz funkcję i przekaż parametr put jako typ ogólny.
źródło
Spróbuj poniższego kodu:
źródło
Robiłem to w całym kodzie i chciałem umieścić to w metodzie. Chciałem to tutaj udostępnić, ponieważ nie musiałem używać Convert.ChangeType dla mojej wartości zwracanej. Może to nie jest najlepsza praktyka, ale zadziałała. Ta metoda przyjmuje tablicę typu ogólnego i wartość do dodania na końcu tablicy. Tablica jest następnie kopiowana z usuniętą pierwszą wartością, a wartość pobrana do metody jest dodawana na końcu tablicy. Ostatnią rzeczą jest to, że zwracam ogólną tablicę.
źródło