解析从字符串到未知变量类型的值

本文关键字:变量 类型 未知 字符串 | 更新日期: 2023-09-27 18:16:11

对于我正在开发的一款游戏(使用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]));
        }
    }
}

如果有什么不清楚的地方,或者需要更多的信息,请告诉我。问候,洛根

解析从字符串到未知变量类型的值

与其尝试自己做这个,我建议您使用内置的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);

一个额外的注意事项:如果你正在走自建路线,那么你可能想要在数据转换中更健壮一点(即检查字符串是否为空,并且在转换为数字时是否是数字等)。

我要明确地说,这是序列化的完美案例。

但是,如果你愿意,你也可以使用:

Convert.ChangeType(object value, Type type)
所以在上面的例子中,它应该是这样的:
f.SetValue(current, Convert.ChangeType(f.GetType().Parse(line.Split(new char[] {'='})[1])), f.GetType());

你在找这样的东西吗?假设您知道对象进入的顺序:

var converter = TypeDescriptor.GetConverter(f.GetType());
var result = converter.ConvertFrom(line.Split(new char[] {'='})[1]));

如果你把它写出来,你应该知道你写出来的顺序,并按照相同的顺序阅读。

进入项目属性->设置->创建您想要的设置,

然后得到他们

var x = Properties.Settings.Default.MyCoolSetting;

(可以读写)

这些设置将存储在应用程序.config文件的用户设置下,您可以在其中编辑它们