C#: Verwendung von generischen Methode mit "out" - variable
Ich möchte erstellen Sie eine einfache generische Funktion
void Assign<T>(out T result)
{
Type type = typeof(T);
if (type.Name == "String")
{
//result = "hello";
}
else if (type.Name == "Int32")
{
//result = 100;
}
else result = default(T);
}
Verwendung:
int value;
string text;
Assign(value); //<<< should set value to 100
Assign(text); //<<< should set text to "hello"
Meine Frage ist, wie kann man das Programm den code um diese Werte dh. die fehlenden codes in Kommentar-Abschnitt.
Vielen Dank für jede Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie sieht es in diesem Fall vielleicht tun Sie es zu vermeiden, dass die Boxen? Schwer zu sagen, ohne weitere Informationen, aber für dieses spezielle Beispiel, es wäre viel einfacher und wahrscheinlich weniger bug-anfällig für verwenden Sie einfach die Methode überladen:
Für die Zwecke des Lernens konkret, was ist hier falsch, Sie müssen zur Besetzung eines Wertes zu einem Objekt vor dem Gießen es auf den generischen Typ:
Welche IMO ziemlich böse und sollte das Letzte Mittel sein - mit Sicherheit nicht Ihr code Reiniger.
Jedes mal, wenn Sie Typ-Prüfung von generischen Parametern, es ist ein guter Indikator, dass Generika nicht die richtige Lösung für Ihr problem. Tut generischen parameter den Typ prüft, macht den code komplexer, nicht einfacher. Es macht eine Methode, die verantwortlich für verschiedene Verhaltensweisen, basierend auf der Art, statt einer Reihe von einzelnen Methoden, die einfach zu ändern, ohne versehentlich Auswirkungen auf andere. Sehen Prinzip Der Einzigen Verantwortung.
Zuerst von allen, ist eine sehr schlechte Muster. Sie sollten nicht verwenden, diese Art von Muster. Vielleicht, wenn Sie beschreiben, was Sie wirklich erreichen wollen, gibt es bessere Antworten.
Code unten funktioniert, aber wie gesagt, code zu schreiben, ist eine schlechte Idee.
Und Verwendung:
Hier ist eine Möglichkeit:
Aber dieser code riecht wirklich schlecht und geht gegen die point-of-Generika (statt überladene Methoden). Ich hoffe, das landet nicht in der Produktion code irgendwo und ist nur zur Erbauung.