Я готов поспорить (хорошо, у меня также есть преимущество наличия исходного кода ...), что в большинстве случаев этот код вызывается в соответствии с вашими примерами в ваш ответ
Get("Site.Twitter.AccountName", "")
или
Get("Site.Twitter.AccountName", 77)
В этом случае вы используете вывод общего типа. Но есть другая, более простая вещь, которая могла бы скомпилироваться там ... не использовать обобщенные значения . Я ожидаю, что здесь есть только несколько сценариев; поэтому напишите несколько классов / перегрузок методов - один для string
, один для int
и т. д.
string Get(string key, string defaultValue) {...}
int Get(string key, int defaultValue) {...}
bool Get(string key, bool defaultValue) {...}
Конечно, будет небольшое дублирование, но компилятор сможет оптимизировать для каждого отдельного сценария - без бокса. Вы даже можете (если хотите) заменить Convert.ChangeType
на что-то вроде int.Parse
(для случая T = int
).
Другой вариант (учитывая ваши примеры) - сделать запоминаемый объект универсальным:
public MySpecialValue<T> {
T val;
bool valSet = false;
T GetValue() {
if (!valSet)
{
val = (T)Convert.ChangeType(DatabaseValue, typeof(T));
valSet = true;
}
return val;
}
public string DatabaseValue { get; set; }
}
и увеличьте код <T>
до уровня, чтобы это было сделано в приведении.