Ich habe eine generische Klasse, die jeden Typ, primitiv oder anders, erlauben sollte. Das einzige Problem dabei ist die Verwendung von . Wenn Sie den Standardwert für einen Werttyp oder eine Zeichenfolge aufrufen, initialisiert er diese auf einen sinnvollen Wert (z. B. eine leere Zeichenfolge). Wenn Sie default(T)
für ein Objekt aufrufen, gibt es null zurück. Aus verschiedenen Gründen müssen wir sicherstellen, dass, wenn es sich nicht um einen primitiven Typ handelt, eine Standardinstanz des Typs nicht null ist. Hier ist der Versuch 1:Der beste Weg zu testen, ob ein generischer Typ eine Zeichenkette ist? (C#)
T createDefault()
{
if(typeof(T).IsValueType)
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
Problem - Zeichenfolge ist kein Werttyp, aber es hat nicht einen parameterlosen Konstruktor haben. Die aktuelle Lösung ist also:
T createDefault()
{
if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
Aber das fühlt sich an wie ein Klodge. Gibt es eine schönere Möglichkeit, mit dem String Case umzugehen?
Ich dachte, ich früher diese Lösung versucht und es hat nicht funktioniert, aber ich muss etwas Dummes getan haben. Und danke, dass Sie darauf hingewiesen haben, dass der Standardwert (string) null zurückgibt, wir haben deswegen noch keinen Fehler gefunden, aber das stimmt. –
@Matt Hamilton: +1, aber Sie sollten Ihre Antwort aktualisieren, um '(T) (object) String.Empty' zurückzugeben, wie von CodeInChaos vorgeschlagen, da der Rückgabetyp der Methode generisch ist, können Sie nicht einfach einen String zurückgeben. – VoodooChild
Was ist mit dem Schlüsselwort "is"? Ist das nicht von Nutzen? –