Ich kann anrufen Get<int>(Stat);
oderGet<string>(Name);
Aber beim Kompilieren bekomme ich:
Typ 'int' kann nicht implizit in 'T' konvertiert werden.
und das gleiche für string
.
public T Get<T>(Stats type) where T : IConvertible
{
if (typeof(T) == typeof(int))
{
int t = Convert.ToInt16(PlayerStats[type]);
return t;
}
if (typeof(T) == typeof(string))
{
string t = PlayerStats[type].ToString();
return t;
}
}
Antworten:
Jedes Mal, wenn Sie einen Typ in einem Generikum einschalten, machen Sie mit ziemlicher Sicherheit etwas falsch . Generika sollten generisch sein ; Sie sollten unabhängig vom Typ identisch arbeiten .
Wenn T nur int oder string sein kann, schreiben Sie Ihren Code überhaupt nicht so. Schreiben Sie zwei Methoden, eine, die ein int und eine, die eine Zeichenfolge zurückgibt.
quelle
int, int?, bool, bool?, string
, und es schien unmöglich.Sie sollten in der Lage sein,
Convert.ChangeType()
anstelle Ihres benutzerdefinierten Codes Folgendes zu verwenden:quelle
return (T)(object)PlayerStats[type];
quelle
return (T) t;
weil keine Nullprüfungen notwendig sind.ChangeType
ist wahrscheinlich Ihre beste Option. Meine Lösung ähnelt der von BrokenGlass mit ein wenig Try-Catch-Logik.quelle
Versuche dies:
quelle
Eigentlich können Sie es einfach in
object
und dann in konvertierenT
.T var = (T)(object)42;
Ein Beispiel für
bool
:Manchmal ist dieses Verhalten wünschenswert. Wenn Sie beispielsweise eine generische Methode aus einer Basisklasse oder Schnittstelle implementieren oder überschreiben und je nach
T
Typ verschiedene Funktionen hinzufügen möchten .quelle
Unter Berücksichtigung von @BrokenGlass wird die Logik (
Convert.ChangeType
) den GUID-Typ nicht unterstützt.Error : Ungültige Umwandlung von 'System.String' in 'System.Guid'.
Verwenden Sie stattdessen die folgende Logik,
TypeDescriptor.GetConverter
indem Sie einenSystem.ComponentModel
Namespace hinzufügen .Lesen Sie dies .
quelle
Es sieht so aus, als ob Sie einen brauchen
TypeConverter
, siehe diesen Blogeintrag .quelle
Sie können einfach wie unten besetzen,
quelle