C# 将值从字符串解析为未知变量类型

C# 将值从字符串解析为未知变量类型,c#,parsing,C#,Parsing,对于我正在开发的一款游戏(在C#中),我们需要能够保存和加载选项文件,为了便于使用,我们决定将其作为纯文本。 但是,当我尝试将文本加载回它们的变量时,我遇到了一个问题,因为我并不总是知道它需要加载到什么类型的变量中 下面的代码行是有效的,除了我还没有找到类似于 f.GetType().Parse() 这是实际代码 OptionsClass current = new OptionsClass(); using(StreamReader reader = new StreamRead

对于我正在开发的一款游戏(在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

我建议您使用内置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);

另一个注意事项:如果您选择自建路线,那么您可能希望在数据转换中更稳健一些(即,检查字符串是否为空,转换为数字时是否为数字等)。

如果您写出来,您应该知道写出来的顺序,然后按相同的顺序阅读。

转到项目属性->设置->创建所需的设置

然后去对付他们

var x = Properties.Settings.Default.MyCoolSetting;
(你可以读写它们)


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

我肯定要补充的是,这是序列化的完美案例

但是,如果需要,也可以使用:

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

您试图做的就是所谓的序列化。如果您搜索“.net序列化”,将有大量关于如何根据类的结构/内容自动持久化和恢复信息的信息。如果您使用SOAP之类的工具,它将序列化所有数据类型以及值。确实,只是我的选项类包含了很多变量,而且我们还在开发中,我可能会在以后添加更多变量,所以我只想限制当我做更改时/如果我做了更改,我必须进行更改的位置数量。