Mam klasę, której chcę użyć do przechowywania „właściwości” innej klasy. Te właściwości mają po prostu nazwę i wartość. Idealnie, chciałbym móc dodawać właściwości pisane na maszynie , tak aby zwracana „wartość” była zawsze zgodna z typem, jaki chcę.
Ten typ powinien zawsze być prymitywny. Ta klasa podklasuje klasę abstrakcyjną, która zasadniczo przechowuje nazwę i wartość jako ciąg znaków. Pomysł polega na tym, że ta podklasa doda pewne bezpieczeństwo typu do klasy bazowej (a także uratuje mnie przy pewnej konwersji).
Stworzyłem klasę, która jest (z grubsza) tym:
public class TypedProperty<DataType> : Property
{
public DataType TypedValue
{
get { // Having problems here! }
set { base.Value = value.ToString();}
}
}
Pytanie brzmi:
Czy istnieje „ogólny” sposób na konwersję łańcucha znaków z powrotem na prymityw?
Nie mogę znaleźć żadnego ogólnego interfejsu, który łączy konwersję na całym forum (coś takiego jak ITryParsable byłoby idealne!).
źródło
Odpowiedzi:
Nie jestem pewien, czy poprawnie zrozumiałem twoje intencje, ale zobaczmy, czy to pomaga.
źródło
Convert.ChangeType
nie jest to zbyt uniwersalne i rozszerzalne rozwiązanie, ale działa na większość podstawowych typów. jeśli potrzebne jest coś lepszego, nie ma problemu, aby zawinąć tę metodę w coś większego, jak sugeruje Tim, lub użyć innej metody konwersji.Metoda lubos hasko zawodzi w przypadku wartości zerowych. Poniższa metoda będzie działać w przypadku wartości zerowych. Jednak nie wpadłem na to. Znalazłem go za pośrednictwem Google: http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx Kredyt dla „Tuna Toksoz”
Pierwsze użycie:
Klasa jest poniżej.
źródło
tc
(naTypeConverter
) jeden jedyny raz.TypeConverter
jest wolny, ponieważ używa refleksji do wyszukiwaniaTypeConverterAttribute
. Jeśli zainicjujesz pojedynczeTypeConverter
pole prywatne , powinieneś być w stanie wielokrotnie korzystać z niegoTypeConverter
wielokrotnie.object
, zgłasza wyjątek. Byłem w stanie to obejść, używając `if (typeof (T) .IsPrimitive) {return TConverter.ChangeType <T> (StringValue); } else {object o = (object) StringValue; wrócić do; } `jako zamiennik dla próbki użyciaTConverter.ChangeType<T>(StringValue)
Dla wielu typów (liczba całkowita, podwójna, data i godzina itp.) Istnieje statyczna metoda analizy składni. Możesz go wywołać za pomocą odbicia:
źródło
TypeDescriptor
jest klasą posiadającą metodę,GetConvertor
która akceptujeType
obiekt, a następnie można wywołaćConvertFrom
metodę konwersjivalue
tego określonego obiektu.źródło
Możesz użyć konstrukcji takiej jak klasa cech . W ten sposób uzyskałbyś sparametryzowaną klasę pomocnika, która wie, jak przekonwertować ciąg znaków na wartość własnego typu. Wtedy twój getter może wyglądać następująco:
Teraz muszę zaznaczyć, że moje doświadczenie ze sparametryzowanymi typami jest ograniczone do C ++ i jego szablonów, ale wyobrażam sobie, że jest jakiś sposób na zrobienie tego samego za pomocą generycznych C #.
źródło
Sprawdź statyczny
Nullable.GetUnderlyingType
. - Jeśli typ bazowy ma wartość NULL, parametr szablonu nie jestNullable
i możemy użyć tego typu bezpośrednio - Jeśli typ bazowy nie ma wartości NULL, użyj typu bazowego w konwersji.Wydaje się dla mnie pracować:
źródło
Z inspiracji odpowiedzią Boba te rozszerzenia obsługują również konwersję wartości zerowej i wszystkie pierwotne konwersje wstecz i czwarte.
Przykłady
źródło
Korzystam z konwersji za pomocą obiektu. To jest trochę prostsze.
źródło
Użyłem odpowiedzi lobos i to działa. Miałem jednak problem z konwersją podwójnych z powodu ustawień kultury. Więc dodałem
źródło
Kolejna odmiana. Obsługuje wartości zerowalne, a także sytuacje, w których ciąg jest zerowy, a liter T nie ma wartości zerowej .
źródło
Możesz to zrobić w jednym wierszu, jak poniżej:
Szczęśliwego kodowania;)
źródło