Ostatnio w jednym z projektów, w których brałem udział dostawałem w niektórych miejscach kolekcję obiektów zaś w innych, parametrami metody były same obiekty. Potrzebowałem, więc czegoś generycznego by móc je sobie konwertować. W tym celu szybko naskrobałem extension method:

public static class ObjectEx
{
    public static T ConvertTo<T>(this object obj)
    {
        if (obj == null || obj == DBNull.Value)
            return default(T);

        var converter = TypeDescriptor.GetConverter(typeof(T));

        if (converter.CanConvertFrom(typeof(object)))
            return (T)converter.ConvertFrom(obj);
        else
            return (T)converter.ConvertFromInvariantString(obj.ToString());
    }
}

// sposob wykorzystania
public string DoSmth(object someValue)
{
        // do smth or...
        return someValue.ConvertTo<string>();
}

W nim dałem podstawowe założenia – jeżeli wartość jest null lub DBNull.Value to zwróć wartość domyślną. Jeżeli zaś próbowałem przekonwertować na przykład wartość double na int to chciałem mieć zwracany wyjątek – to oznacza, że dane które oczekiwałem, że będą poprawne nie były (ach nie mogę się już doczekać na kontrakty :)).

PS rozwiązanie to nie jest dla wszystkich możliwych konwersji i nie jest “idealne”, ale co w tym świecie jest? :) Na przykład dla typów własnych warto w takim momencie napisać własnego TypeConverter.