Преобразование между int, float, double, long и string

#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));