Próbuję dokonać konwersji danych. Niestety, większość danych jest w łańcuchach, gdzie powinny być int lub double, itd ...
Więc mam coś takiego:
double? amount = Convert.ToDouble(strAmount);
Problem z tym podejściem polega na tym, że jeśli strAmount jest puste, jeśli jest puste, chcę, aby kwota była zerowa, więc kiedy dodam go do bazy danych, kolumna będzie pusta. Więc napisałem to:
double? amount = null;
if(strAmount.Trim().Length>0)
{
amount = Convert.ToDouble(strAmount);
}
Teraz to działa dobrze, ale mam teraz pięć wierszy kodu zamiast jednego. To sprawia, że czytanie jest trochę trudniejsze, zwłaszcza gdy mam do konwersji dużą liczbę kolumn.
Pomyślałem, że użyję rozszerzenia klasy string i klasy generycznej, aby przekazać typ, ponieważ może to być double, int lub long. Więc spróbowałem tego:
public static class GenericExtension
{
public static Nullable<T> ConvertToNullable<T>(this string s, T type) where T: struct
{
if (s.Trim().Length > 0)
{
return (Nullable<T>)s;
}
return null;
}
}
Ale pojawia się błąd: nie można przekonwertować typu „string” na „T”?
Czy jest na to sposób? Nie jestem zaznajomiony z tworzeniem metod przy użyciu typów ogólnych.
źródło
Odpowiedzi:
Inną rzeczą, o której należy pamiętać, jest to, że sam łańcuch może być pusty.
źródło
Możesz spróbować użyć poniższej metody rozszerzenia:
W ten sposób możesz to zrobić:
źródło
A co z tym:
Oczywiście nie uwzględnia to niepowodzenia konwersji.
źródło
Napisałem ten konwerter typów ogólnych. Działa z wartościami Nullable i standardowymi, konwertując między wszystkimi konwertowalnymi typami - nie tylko ciągiem. Obsługuje wszelkiego rodzaju scenariusze, których można się spodziewać (wartości domyślne, wartości null, inne wartości itp.)
Używam tego od około roku w dziesiątkach programów produkcyjnych, więc powinno być całkiem solidne.
źródło
OutOfMemoryException
jeśli nie możesz zawęzić go do ustalonego zestawu typów wyjątków.Możesz spróbować:
wykonaj własne sprawdzenie zerowe i w
int?
razie potrzeby zwróć . Będziesz także chciał to opakować w pliktry {}
źródło
Spróbuj tego ...
Więc nazwij to tak ...
źródło
Podoba mi się odpowiedź Joela, ale nieco ją zmodyfikowałem, ponieważ nie jestem fanem jedzenia wyjątków.
źródło
Możesz użyć następujących z obiektami, niestety nie działa to jednak w przypadku łańcuchów.
Używam go do zawijania zmiennej sesji we właściwości (na stronie bazowej) .. więc moje rzeczywiste użycie to (na mojej stronie bazowej):
Mogę sprawdzić wartość null w logice strony:
źródło
CType(Object, Nullable(Of Double))
działa dobrze ze stringamiNie da się tego obejść. Wartość null, podobnie jak metoda, jest ograniczona do używania tylko typów wartości jako argumentu. Ciąg jest typem referencyjnym i dlatego jest niezgodny z tą deklaracją.
źródło
źródło
Istnieje rozwiązanie ogólne (dla każdego typu). Użyteczność jest dobra, ale implementację należy poprawić: http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
Pozwala to na pisanie bardzo czystego kodu, takiego jak ten:
i również:
źródło
typeName.IndexOf
? Naprawdę?) I dziwnego zachowania (pokazanaTryConvert
funkcja nawet nie obsługuje poprawnie wartości null).Oto coś na podstawie zaakceptowanej odpowiedzi. Usunąłem try / catch, aby upewnić się, że wszystkie wyjątki nie zostaną połknięte i nie zostaną rozwiązane. Upewnij się również, że zmienna zwracana (w zaakceptowanej odpowiedzi) nigdy nie jest inicjowana dwukrotnie na nic.
źródło
Mój przykład dla typów anonimowych:
źródło
Kolejna odmiana. Ten
NotSupportedException
jeśli nie można przekonwertować typustring
. Na przykład niestandardowa struktura bez konwertera typów.(T?)null
jeśli analiza ciągu nie powiedzie się. Nie ma potrzeby sprawdzania wartości null ani białych znaków.źródło
Dodajmy jeszcze jedno podobne rozwiązanie do stosu. Ten również analizuje wyliczenia i wygląda ładnie. Bardzo bezpieczny.
https://github.com/Pangamma/PangammaUtilities-CSharp/blob/master/PangammaUtilities/Extensions/ToNullableStringExtension.cs
źródło
Ogólna odpowiedź udzielona przez „ Joela Coehoorna ” jest dobra.
Ale to jest inny sposób bez użycia tych
GetConverter...
lubtry/catch
bloków ... (nie jestem pewien, ale w niektórych przypadkach może to mieć lepszą wydajność):Sposób użycia jest następujący:
źródło
TypeDescriptor.GetConverter
... kodów. To tylko inny sposób.