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.