C# 将值从字符串解析为未知变量类型
对于我正在开发的一款游戏(在C#中),我们需要能够保存和加载选项文件,为了便于使用,我们决定将其作为纯文本。 但是,当我尝试将文本加载回它们的变量时,我遇到了一个问题,因为我并不总是知道它需要加载到什么类型的变量中 下面的代码行是有效的,除了我还没有找到类似于C# 将值从字符串解析为未知变量类型,c#,parsing,C#,Parsing,对于我正在开发的一款游戏(在C#中),我们需要能够保存和加载选项文件,为了便于使用,我们决定将其作为纯文本。 但是,当我尝试将文本加载回它们的变量时,我遇到了一个问题,因为我并不总是知道它需要加载到什么类型的变量中 下面的代码行是有效的,除了我还没有找到类似于 f.GetType().Parse() 这是实际代码 OptionsClass current = new OptionsClass(); using(StreamReader reader = new StreamRead
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之类的工具,它将序列化所有数据类型以及值。确实,只是我的选项类包含了很多变量,而且我们还在开发中,我可能会在以后添加更多变量,所以我只想限制当我做更改时/如果我做了更改,我必须进行更改的位置数量。