解析从字符串到未知变量类型的值
本文关键字:变量 类型 未知 字符串 | 更新日期: 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文件的用户设置下,您可以在其中编辑它们