对于我正在开发的游戏(在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
答案 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文件中,您可以在其中进行编辑