2009-08-12 14 views
5

Chcę użyć odbicia, aby ustawić niektóre pola zgodnie z danymi z pliku. Informacje, które mogę posiadać, to TypeName, TypeValue i FieldName.Korzystanie z odbicia, aby ustawić wartość Int32

Chociaż jest to trywialne na zajęciach (Activator.CreateInstance i PropertyInfo.SetValue), jestem nieco zdezorientowany, jeśli chodzi o typy wartości, takie jak Int32, które nie ma żadnych właściwości. Widzę, że IsValueType ma wartość true dla tych typów, ale ponieważ moja TypeValue jest ciągiem znaków (tj. Ciąg TypeValue = "400"), nie wiem, jak to przypisać.

Czy muszę użyć GetMethods(), aby sprawdzić, czy istnieje metoda .Parse? Czy to coś dla TypeConverter?

Wiem, że mogłem po prostu kodować niektóre typowe typy wartości (nie ma ich tak wiele) i mieć duże instrukcje switch(), ale zastanawiam się, czy istnieje coś, co automagicznie wykonuje konwersję "Konwertuj ciąg na T" ?

Odpowiedz

7
// get the type converters we need 
TypeConverter myConverter = TypeDescriptor.GetConverter(typeof(int)); 

// get the degrees, minutes and seconds value 
int Degrees = (int)myConverter.ConvertFromString(strVal); 

to powinno pomóc

+0

tak jest, TypeDescriptor klasa to magia, której szukałem, dzięki! –

4

ArsenMkrt ma rację; TypeConverter jest sposobem, aby tu przejść; kilka dodatkowych myśli:

Możesz rozważyć użycie "modelu komponentu" zamiast refleksji; tj. zamiast typeof(T).GetProperties(), rozważ TypeDescriptor.GetProperties(typeof(T)). Daje to zestaw rekordów PropertyDescriptor zamiast odbicia PropertyInfo. Dlaczego to jest przydatne?

  • bo ludzie mogą rzeczywiście określić konwertera za nieruchomości (poniżej) - to jest narażony jako prop.Converter na PropertyDescriptor
  • jeśli plik jest duży, można uzyskać wzrost wydajności przy użyciu HyperDescriptor

Jako przykład nieruchomości o niestandardowym Przelicznik:

[TypeConverter(typeof(CurrencyConverter))] // bespoke 
public decimal TotalPrice {get;set;} 
Powiązane problemy