#c#
#c#
Вопрос:
Я создаю игру, в которой я считываю некоторые данные из баз данных json. Все базы данных содержат похожие данные, хотя и немного отличаются. Некоторые хранят «мощность» как строку, в то время как другие хранят ее как число. Существует также тот, который хранит его либо как строку, либо как число, поскольку иногда «мощность» может быть «1 X» или что-то в этом роде. Кроме того, некоторые хранят переменную «power» под именем «power», в то время как другие используют «pwr». Итак, я пишу метод, чтобы легко получить их. В моем приложении (написанном на c #) Я получаю словарь со всей информацией. Итак, в настоящее время у меня есть это:
void TryGetValueFromJson<T>(ref T variableToFill, string[] possibleValueNames, Dictionary<string,object> info) {
foreach (string valueName in possibleValueNames) {
object value;
if (info.TryGetValue(valueName, out value)) {
//I'm stuck here
break;
}
}
}
variableToFill — это, как следует из названия, переменная в моем классе, для которой я считываю значение. строка[] — это все возможные имена для этой переменной в разных базах данных («power», «pwr»). Переменная «info» — это json, который я получаю с сервера.
Итак, теперь мне нужно преобразовать разные значения в требуемый тип. Если моя переменная заполняется строкой, но в базе данных она имеет значение int, ее следует преобразовать. Хотя я не уверен, как это сделать правильно.
Ответ №1:
Convert.ChangeType
Метод — ваш друг. Это один из тех методов, которые выполняют за вас много грязной работы и могут сэкономить массу кода. Это зависит от типа, реализующего IConvertible
интерфейс, но, к счастью, большинство примитивных типов:
void TryGetValueFromJson<T>(ref T variableToFill, string[] possibleValueNames, Dictionary<string,object> info)
{
Type outputType = typeof(T);
foreach (string valueName in possibleValueNames)
{
object value;
if (info.TryGetValue(valueName, out value))
{
variableToFill = (T)Convert.ChangeType(value, outputType);
break;
}
}
}
Комментарии:
1. Спасибо! Теперь мне также интересно, есть ли способ изменить метод для возврата значения вместо присвоения его параметру ref? Спасибо!
2. Конечно. Просто установите возвращаемый тип
T
вместоvoid
, иreturn
результатChangeType
, конечно, преобразуется в T .3. Но тогда мне все равно нужен параметр «ref T variableToFill», верно? И если я изменю это на параметр «Type», то у C # не будет способа узнать, каким должно быть T : s
4. Нет, <T> в имени метода делает это за вас. Вы можете просто полностью удалить параметр ref.
5. Используйте
default(T)
в качестве универсального.
Ответ №2:
Я думаю, что вы можете использовать Convert
класс здесь:
variableToFill = (T)Convert.ChangeType(value, typeof(T));