views:

1275

answers:

2

Judging by the title of this question, what I want to do may not be possible so I will describe what I'm doing and you can feel free to let me know what I'm doing wrong and what would be a better way to accomplish my goal.

I have an XML file that describes 1) a custom object that is derived of a base type, and 2) the internal field names and associated values. These derived objects may have additional fields that the base class doesn't know about.

I extract the type of object as a string and I place all the object data into a dictionary where the key is the field name and the value is the field's value. I instantiate the object using the string name and the object's default constructor. I can sniff out all the object's properties into a PropertyInfo[]. Now I need to take all the values that are in string form and convert them into the correct data types so I can load them into the object's properties. (As I type this, it sounds like I'm taking a sort of save state and restoring it, but I've only heard of this sort of thing. If you would like to advise along these lines, then please keep in mind that I'm stuck reading data from an XML file and I can't change that.)

I can convert all the string values to a type given by a Type object and using a brute-force function that I made having the following definition:

public object convertMe(string v, Type t)

Since I don't know what Type I'm throwing at the function, I don't know what's coming back and I am unable to explicitly cast the object to the proper type for assigning to the aforementioned property. I have been attempting the following sort of casts to no avail:

string objectType = /*read type string from XML*/;

... // Wherein I instantiate an object "theObject" and get PropertyInfo[] from it.
... // I also make sure that I'm trying to assign the correct data to
... // the correct property.

Type t = currentProperty.PropertyType;
object o = convertMe(value, Type.GetType(qtype));
currentProperty.SetValue(theObject, (t)o, null);  // Doesn't work
currentProperty.SetValue(theObject, (t)Convert.ChangeType(o, t), null);  // Doesn't work.  Apparently (t) is bad syntax.

Ultimately, my goal is to create an instance of the object and load it with data from the XML file in such a way that the data types aren't hard-coded. The reason that I'm doing this in C# is because this used to be a Python program and I've been assigned to translate it into C# .NET 2.0. It's a learning experience to say the least. The reason that I created that "brute-force function" is because I was looking for a way around this casting problem, but no matter what I try I can't get it to work. I could likely do this on my own using pure force, but I figured that there must be an elegant solution that I'm missing.

Any help is greatly appreciated!

+6  A: 

You don't need any cast there at all. PropertyInfo.SetValue takes an argument of type object, so just pass o to it, and that will be it.

Pavel Minaev
Well frell me dead. I'm gonna chalk this up to code-blindness. Although the MSDN docs said that it took an Object, every example showing its use used the proper value type, so I never made that connection. Many thanks!
Sanjamal
+3  A: 

You don't need the cast at all. Casting is only useful when you're trying to deal with the objects directly, not when you're using reflection.

When you go to set the property, you're using PropertyInfo.SetValue. This takes an object as the value parameter, so there is no need to try to coerce this into the specific type (as long as the object is already the correct type).

Since you've already done a "convertMe" that puts the object into the correct type (cast or boxed into an Object), you're all set - just use it.

Reed Copsey
Big thanks to you too!
Sanjamal