Gibt es eine Möglichkeit, diese Methode generisch zu gestalten, damit ich einen String, Bool, Int oder Double zurückgeben kann? Im Moment wird eine Zeichenfolge zurückgegeben, aber wenn "true" oder "false" als Konfigurationswert gefunden werden kann, möchte ich beispielsweise einen Bool zurückgeben.
public static string ConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName];
}
c#
.net
generics
return-type
MacGyver
quelle
quelle
dynamic
Schlüsselwort verwenden. Dafür fallen Leistungskosten an, aber beim Lesen einer Konfigurationsdatei sind die Leistungskosten mit ziemlicher Sicherheit unbedeutend.Antworten:
Sie müssen es zu einer generischen Methode machen, wie folgt:
Der Anrufer muss jedoch den Typ angeben, den er erwartet. Sie könnten dann möglicherweise verwenden
Convert.ChangeType
, vorausgesetzt, alle relevanten Typen werden unterstützt:Ich bin nicht ganz davon überzeugt, dass dies alles eine gute Idee ist, wohlgemerkt ...
quelle
ConfigSettingString
,ConfigSettingBool
usw.) den Vorteil der Methode Körpers hat , die kürzer sein wird, klarer und besser fokussierte .Sie könnten verwenden
Convert.ChangeType()
:quelle
Es gibt viele Möglichkeiten, dies zu tun (nach Priorität aufgelistet, spezifisch für das OP-Problem)
Option 1: Gerader Ansatz - Erstellen Sie mehrere Funktionen für jeden erwarteten Typ, anstatt nur eine generische Funktion zu haben.
Option 2: Wenn Sie keine ausgefallenen Konvertierungsmethoden verwenden möchten - Wandeln Sie den Wert in ein Objekt und dann in einen generischen Typ um.
Hinweis - Dies wird einen Fehler auslösen, wenn die Besetzung nicht gültig ist (Ihr Fall). Ich würde dies nicht empfehlen, wenn Sie sich über den Typ Casting nicht sicher sind, sondern Option 3 wählen.
Option 3: Generisch mit Typensicherheit - Erstellen Sie eine generische Funktion für die Typkonvertierung.
Hinweis - T ist der erwartete Typ, beachten Sie die where-Einschränkung hier (Typ von U muss IConvertible sein, um uns vor den Fehlern zu bewahren)
quelle
U
? Es macht keinen Sinn, dies zu tun, und es macht es schwieriger, die Methode aufzurufen. Akzeptiere einfachIConvertible
stattdessen. Ich denke nicht, dass es sich lohnt, die zweite Option für diese Frage aufzunehmen, da sie die gestellte Frage nicht beantwortet. Sie sollten die Methode wahrscheinlich auch in der ersten Option umbenennen ...Sie müssen den Typ Ihres Rückgabewerts der Methode in den generischen Typ konvertieren, den Sie beim Aufruf an die Methode übergeben.
Sie müssen einen Typ übergeben, der für den Wert, den Sie über diese Methode zurückgeben, umwandelbar ist.
Wenn Sie einen Wert zurückgeben möchten, dessen Typ nicht in den von Ihnen übergebenen generischen Typ umwandelbar ist, müssen Sie möglicherweise den Code ändern oder sicherstellen, dass Sie einen Typ übergeben, der für den Rückgabewert der Methode umwandelbar ist. Dieser Ansatz wird daher nicht empfohlen.
quelle
return (T)Convert.ChangeType(number, typeof(T));
GenauErstellen Sie eine Funktion und geben Sie den put-Parameter als generischen Typ aus.
quelle
Bitte versuchen Sie es mit dem folgenden Code:
quelle
Ich habe dies in meinem gesamten Code ausgeführt und wollte einen Weg finden, es in eine Methode zu integrieren. Ich wollte dies hier teilen, weil ich Convert.ChangeType nicht für meinen Rückgabewert verwenden musste. Dies ist möglicherweise keine bewährte Methode, hat aber bei mir funktioniert. Diese Methode verwendet ein Array vom generischen Typ und einen Wert, der am Ende des Arrays hinzugefügt werden soll. Das Array wird dann mit dem ersten entfernten Wert kopiert und der in die Methode aufgenommene Wert wird am Ende des Arrays hinzugefügt. Das Letzte ist, dass ich das generische Array zurückgebe.
quelle