Question

i'm using this extension method for converting objects in my project. But its unable to convert GUID as its doesn't implements IConvertible Interface but for conversion i always have to use new Guid(fooobject) but i want that i could use this method to convert objects to GUID. any idea how can we make it flexible to work with GUID also.

Extension method is

 public static T ToType<T>(this object val, T alt) where T : struct, IConvertible 
    {
        try
        {
            return (T)Convert.ChangeType(val, typeof(T));
        }
        catch
        {
            return alt;
        }
    }
Was it helpful?

Solution

Because you have the constraint that the type you are converting to implements the IConvertible interface (whereas the Guid structure) does not, you have no choice to create an overload, like this:

public static Guid ToType(this object val, Guid alt)
{
    try
    {
        // Convert here.
    }
    catch
    {
        return alt;
    }
}

When you pass a Guid, it will resolve because of section 7.4.2 of the C# specification (emphasis mine):

Once the candidate function members and the argument list have been identified, the selection of the best function member is the same in all cases:

  • Given the set of applicable candidate function members, the best function member in that set is located.

Given that Guid is a more specific match than the type parameter T, your second method will be called.

Note, if you removed the IConvertible interface constraint, you could handle this in a single method, but you'd have to be able to have logic to handle any structure that is passed for T (a TypeConverter instance would be handy here).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top