将字符串中的值解析为未知变量类型

时间:2011-11-30 23:48:43

标签: c# parsing

对于我正在开发的游戏(在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 个答案:

答案 0 :(得分:6)

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

另外一个注意事项:如果你要使用自建路由,那么你可能希望在数据转换中更加健壮(即检查字符串是否为空并且在转换为数字时是数字等等。)

答案 1 :(得分:3)

我肯定会补充一点,这是序列化的完美案例。

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

Convert.ChangeType(object value, Type type)

因此,在上面的示例中,它将类似于:

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

请注意,这不会检查空值。

答案 2 :(得分:3)

你正在寻找这样的东西吗?假设您知道对象的订单是什么:

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

答案 3 :(得分:1)

如果你把它写出来,你应该知道你写的是什么顺序,并以相同的顺序阅读。

答案 4 :(得分:0)

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

然后去找他们

var x = Properties.Settings.Default.MyCoolSetting;

(你可以读写)

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