This is a follow-up to this question about converting values with reflection. Converting an object of a certain type to another type can be done like this:
object convertedValue = Convert.ChangeType(value, targetType);
Given two Type instances (say FromType and ToType), is there a way to test whether the conversion will succeed?
E.g. can I write an extension method like this:
public static class TypeExtensions
{
public static bool CanChangeType(this Type fromType, Type toType)
{
// what to put here?
}
}
EDIT: This is what I have right now. Ugly, but I don’t see another way yet…
bool CanChangeType(Type sourceType, Type targetType)
{
try
{
var instanceOfSourceType = Activator.CreateInstance(sourceType);
Convert.ChangeType(instanceOfSourceType, targetType);
return true; // OK, it can be converted
}
catch (Exception ex)
{
return false;
}
I was just encountering this same issue, and I used Reflector to look at the source for ChangeType. ChangeType throws exceptions in 3 cases:
After those 3 are checked, it is guaranteed that it can be converted. So you can save a lot of performance and remove the try{}/catch{} block by simply checking those 3 things yourself: