2012-06-08 13 views
7

Mam metodę użytkową, która zwraca silnie typami wartości od starej .INI konfiguracji pliku typu, z podpisemRzuć string.Empty to (generic) T w C#?

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

chcę ciągi być specjalne, w które chciałbym wartość domyślną dla defaultValue być string.Empty, a nie default(string) (tj. null), w przypadku, gdy koder nie określił wartości domyślnej.

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

Próbowałem twardego odlewu, a kluczowe as, bezskutecznie.

+0

Wywoływanie uprawnienia LSP nie wydaje się bardzo przystoi tym konkretnym przypadku ... –

Odpowiedz

11

do 'hacky' sposób:

return (T)(object)string.Empty; 

Uwagi:

  • Dość bezpieczne jak masz sprawdzić warunki wstępne.
  • Kara pieniężna niezauważalna dla typów referencyjnych.
+0

Dzięki @Leppie + smartcaveman! – StuartLC

5

Musisz to zrobić tak: (T)(object)(string.Empty).

Również drobna optymalizacja jest przechowywanie tego w statycznym polu Parametry tylko do odczytu, dzięki czemu nie trzeba robić odlewy ale jeden raz na generycznego parametru (zamiast za wywołanie metody)

+0

* Bardzo * niewielka optymalizacja ... odlewy są "bardzo cholernie szybkie". –

+1

@ pst, prawda, (przynajmniej z typami odniesienia), ale dlaczego nie? – smartcaveman

+0

Inne rzeczy do pracy :) –

0

Gdybym Nie mylić, ostatni parametr w GetIniSetting jest opcjonalny, a otrzymasz domyślny (ciąg) tylko wtedy, gdy nic nie dostarczysz. Więc używać string.Empty jako domyślną wartość ciągu nawiązać połączenie jak:

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

Mylisz się. Łańcuch jest typem referencyjnym, więc możesz podać 'null' – smartcaveman

+0

(A' default (string) 'zwraca wartość' null') –