views:

742

answers:

3

My scenario should be simple... the type I want to convert FROM is ALWAYS 'string'. What I want to convert to... could be many things - ints, DateTimes, ... strings, etc.

This would be easy:

string valueToConvertFrom = "123";

int blah = Convert.ToInt32(valueToConvertFrom);

However... I don't know (until runtime) that the value I need to convert to is an 'Int' (or whatever). I have tried this:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

object blah = Convert.ChangeType(valueToConvertFrom, convertToType);

But that gives me the following error: "Object must implement IConvertible."

I don't want to have to do a switch statement and call "Convert.ToBlah" based on the type name... any suggestions?

+1  A: 

String class implements IConvertible, this code simply SHOULD work. Which version of .NET are you aiming?

object o = Convert.ChangeType( str, convertToType );

Besides, most of the types you mentioned implement Parse method, so your best shot might be something like this.

Type convertToType = ...;
MethodInfo mi = convertToType.GetMethod("Parse", BindingFlags.Static);
object blah;
if(mi != null)
{
    blah = mi.Invoke(null, new object[]{valueToConvertFrom});
}
else
{
    // the type doesn't implement the Parse method, handle it another way :/
}
arul
this looks like and feels like a hack...
Asher
+9  A: 

the clean way to do it is using the a TypeConverter. you can get an instance of a type converter by calling the TypeDescriptor.GetConverter and then using the instance of the type converter to do the convertion. so something like this:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);    

object blah =tc.ConvertFromString(valueToConvertFrom);
Asher
That is incorrect, these operations are not supported.Corrected code:Type convertToType = typeof( int );TypeConverter tc = TypeDescriptor.GetConverter( convertToType );object blah =tc.ConvertFromString( valueToConvertFrom );
arul
@arul - you are right. fixed it.
Asher
This is brilliant. Thanks a bunch!
Skinniest Man
A: 

The reason why I closed this is because my code had a bug in it... I was pulling from the wrong field initially, and that field didn't implement IConvertible.

+1 for both answers... "String class implements IConvertible, this code simply SHOULD work" that's true. But Asher's solution is great as I learned something new (and it's a very clean solution).

Thanks again!

Timothy Khouri