For a game I'm developing on (in C#), we need to be able to save and load options files, and for ease of use, we decided to do it as plain text. I have a problem however when I try to load the text back into their variables as I don't always know what type of variable it needs to be loaded into.
The following line of code works, except for the fact that I have yet to find functionallity that resembles
f.GetType().Parse()
Heres the actual code
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]));
}
}
}
Let me know if anything is unclear, or more information is needed. Regards, -Logan
Rather than trying to do this yourself, I would suggest that you use the builtin XML or JSON serialiation.
However, if you are going to implement this yourself, then I would suggest that you perform a switch on the type of field and convert the value according to the data type of the field. For example:
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);
One additional note: if you are going the self-built route, then you probably want to be a little more robust in the data conversions (i.e. checking to see if the string is not null and is numeric when converting to a number, etc).
I'd definitely add that this is a perfect case for serialization.
However, if you want, you can also use:
Convert.ChangeType(object value, Type type)
So in the example above it would be something like:
f.SetValue(current, Convert.ChangeType(f.GetType().Parse(line.Split(new char[] {'='})[1])), f.GetType());
Note this doesn't check for null values.
Are you looking for something like this? Assuming you know what order your objects are coming in:
var converter = TypeDescriptor.GetConverter(f.GetType());
var result = converter.ConvertFrom(line.Split(new char[] {'='})[1]));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With