Разбор значения из строки в неизвестный тип переменной - PullRequest
5 голосов
/ 01 декабря 2011

Для игры, над которой я работаю (на C #), нам нужно иметь возможность сохранять и загружать файлы опций, и для простоты использования мы решили сделать это в виде простого текста. Однако у меня возникает проблема, когда я пытаюсь загрузить текст обратно в их переменные, так как не всегда знаю, в какой тип переменной он должен быть загружен.

Следующая строка кода работает, за исключением того факта, что мне еще предстоит найти функциональность, которая напоминает

f.GetType().Parse()

Вот фактический код

OptionsClass current = new OptionsClass();  
    using(StreamReader reader = new StreamReader(path)){
        string line;
        while((line = reader.ReadLine()) != null){
        foreach(FieldInfo f in typeof(OptionsClass).GetFields()){
            f.SetValue(current, f.GetType().Parse(line.Split(new char[] {'='})[1]));

        }
    }
}

Дайте мне знать, если что-то неясно или нужна дополнительная информация. С Уважением, -Logan

Ответы [ 5 ]

6 голосов
/ 01 декабря 2011

Вместо того, чтобы пытаться сделать это самостоятельно, я бы посоветовал вам использовать встроенную сериализацию XML или JSON.

Однако, если вы собираетесь реализовать это самостоятельно, то я бы посоветовал вам выполнить переключениена тип поля и преобразовать значение в соответствии с типом данных поля.Например:

        string sValue = line.Split(new char[] {'='})[1]);
        object oValue;
        switch (f.FieldType.Name.ToLower())
        {
            case "system.string":
               oValue = sValue;
               break;

            case "system.int32":
                oValue = Convert.ToInt32(sValue);
                break;
         etc...

      f.SetValue(current, oValue);

Еще одно примечание: если вы идете по самодельному маршруту, то вы, вероятно, хотите быть немного более устойчивым в преобразованиях данных (т. Е. Проверять, не является ли строкаnull и является числовым при преобразовании в число и т. д.).

3 голосов
/ 20 мая 2013

Вы ищете что-то подобное?Предполагая, что вы знаете, в каком порядке поступают ваши объекты:

var converter = TypeDescriptor.GetConverter(f.GetType());
var result = converter.ConvertFrom(line.Split(new char[] {'='})[1]));
3 голосов
/ 01 декабря 2011

Я бы определенно добавил, что это идеальный вариант для сериализации.

Однако, если вы хотите, вы также можете использовать:

Convert.ChangeType(object value, Type type)

Так что в приведенном выше примере это будетбыть что-то вроде:

f.SetValue(current, Convert.ChangeType(f.GetType().Parse(line.Split(new char[] {'='})[1])), f.GetType());

Обратите внимание, что это не проверяет на нулевые значения.

1 голос
/ 01 декабря 2011

Если вы написали это, вы должны знать, в каком порядке вы это записали, и прочитать в том же порядке.

0 голосов
/ 01 декабря 2011

зайдите в Свойства вашего проекта -> Настройки -> Создайте нужные настройки,

, а затем получите их

var x = Properties.Settings.Default.MyCoolSetting;

(вы можете читать и писать)

эти настройки будут сохранены в вашем файле .config приложений в пользовательских настройках, где вы можете их редактировать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...