2012-06-08 2 views
7

У меня есть служебный метод, который возвращает сильно типизированное значение из старого файла типа .INI конфигурации, с подписьюСтрока string.Empty to (generic) T в C#?

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

Я хочу струн быть особенными, в котором я хотел бы значение по умолчанию для DefaultValue должен быть string.Empty, а не default(string) (т.е. null), в случае, если кодер не указал значение по умолчанию.

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

Я пробовал жесткий кастинг, и as ключевое слово, но безрезультатно.

+0

Призывая силу LSP не кажется, очень подходит для этого конкретного случая ... –

ответ

11

'Hacky' способ:

return (T)(object)string.Empty; 

Примечания:

  • Довольно безопасно, так как у вас есть проверить предварительные условия.
  • Предельное исполнение, незаметное для ссылочных типов.
+0

Спасибо @Leppie + smartcaveman! – StuartLC

5

Вы должны сделать это следующим образом: (T)(object)(string.Empty).

Кроме того, незначительная оптимизация хранить это в статическом поле только для чтения строки, так что вы не должны делать забросы, но один раз в общий параметр (вместо каждого вызова метода)

+0

* Очень * незначительная оптимизация ... отливки «довольно быстро». –

+1

@pst, true, (с указанием типов ссылок, по крайней мере), но почему бы и нет? – smartcaveman

+0

Другие вещи для работы на :) –

0

Если я m не ошибочно, последний параметр в GetIniSetting является необязательным, и вы получите значение по умолчанию (строка) только в том случае, если вы ничего не предоставите для него. Таким образом, чтобы использовать string.Empty в качестве строкового значения по умолчанию сделать вызов, как:

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

Вы ошибаетесь. Строка является ссылочным типом, поэтому вы можете передать «null» – smartcaveman

+0

(И 'default (string)' оценивается как 'null') –