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.














