Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing a value from string to an unknown variable type

Tags:

c#

parsing

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

like image 344
Logan Avatar asked Nov 30 '11 23:11

Logan


3 Answers

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).

like image 163
competent_tech Avatar answered Oct 26 '22 23:10

competent_tech


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.

like image 28
dash Avatar answered Oct 26 '22 23:10

dash


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]));
like image 45
Kristopher Avatar answered Oct 27 '22 01:10

Kristopher