2012-06-08 14 views
7

Ich habe eine Hilfsmethode, die einen stark typisierten Wert von einem alten .INI Konfigurationsdateityp zurückgibt, mit der UnterschriftCast String.Empty zu (generisch) T in C#?

internal static T GetIniSetting<T>(string config, string key, T defVal = default(T)) 

ich Strings, dass sein will speziell, ich den Standardwert für default möchte zu sein string.Empty, nicht default(string) (dh null), wenn der Coder keinen Standardwert angegeben hat.

if (cantFindValueInIniFile == true) 
{ 
    if ((typeof(T) == typeof(string)) && (defaultValue == null)) 
    { 
     // *** Code needed here - Cannot convert string to <T>*** 
     return (T)string.Empty; 
    } 
    return defaultValue; 
} 

Ich habe hart Casting versucht, und das as Schlüsselwort, ohne Erfolg.

+0

Unter Berufung auf die Kräfte des LSP schien nicht sehr passend für diesen speziellen Fall ... –

Antwort

11

Die 'Hacky' Art und Weise:

return (T)(object)string.Empty; 

Hinweise:

  • Ziemlich sicher wie Sie Vorbedingungen haben zu überprüfen.
  • Leistungsstrafe bei Referenztypen nicht wahrnehmbar.
+0

Dank @Leppie + smartcaveman! – StuartLC

5

Sie müssen es so tun: (T)(object)(string.Empty).

Auch eine geringfügige Optimierung ist dies in einem statischen Nur-Lese-String-Feld zu speichern, so dass Sie die Würfe nicht zu tun haben, sondern einmal pro generischen Parameter (statt pro Methodenaufruf)

+0

* Sehr * kleine Optimierung ... Casts sind "verdammt schnell". –

+1

@pst, wahr, (mit Referenztypen, zumindest) aber warum nicht? – smartcaveman

+0

Andere Dinge zu arbeiten :) –

0

Wenn ich Wenn Sie sich nicht irren, ist der letzte Parameter in GetIniSetting optional, und Sie erhalten den Standardwert (string) nur dann, wenn Sie nichts dafür angeben. So string.Empty als Standard-Zeichenfolge-Wert zu verwenden, um den Anruf tätigen wie:

string value = GetIniSetting<string>(config, key, string.Empty); 
+2

Sie sind falsch. Ein String ist ein Referenztyp, so dass Sie 'null' übergeben können. – smartcaveman

+0

(Und' default (string) 'ergibt 'null') –