mam przechowywania operację aktualizacji w następujący sposób:Unboxing typy nullable - obejście?
class Update
{
public Expression MemberExpression { get; set; }
public Type FieldType { get; set; }
public object NewValue { get; set; }
}
Na przykład:
var myUpdate = new Update
{
MemberExpression = (MyType o) => o.LastModified,
FieldType = typeof(DateTime?),
NewValue = (DateTime?)DateTime.Now
}
Wtedy staram się zastosować tę aktualizację później (uproszczony):
var lambda = myUpdate.MemberExpression as LambdaExpression;
var memberExpr = lambda.Body as MemberExpression;
var prop = memberExpr.Member as PropertyInfo;
prop.SetValue(item, myUpdate.Value);
Jednak myUpdate.Value
to DateTime
, a nie DateTime?
. Dzieje się tak dlatego, że po rzuceniu wartości zerowej do object
, staje się ona null
lub powoduje skrzynie typu wartości.
Od (DateTime?)myUpdate.Value
będzie działać, aby przywrócić go do prawidłowego typu, próbowałem symulować ten konstrukt kompilacji przy użyciu Convert.ChangeType
. Jednak mówi, że odlewanie z DateTime
do DateTime?
nie jest możliwe.
Jakie podejście można zastosować, aby przywrócić obiekt do pierwotnego typu?
Czy istnieje sposób na przechowywanie typów zerowanych, regularnych struktur i zwykłych obiektów w jednym polu, i uzyskać dokładną rzecz do niego ponownie?
Jaki jest twój problem? Czy 'prop.SetValue (item, myUpdate.Value)' throw any wyjątek dla ciebie? – PetSerAl
Jak możesz mieć nadzieję, że metoda 'Convert.ChangeType' może być przydatna? Jest to nietypowa metoda, której deklarowanym typem powrotu jest 'object'. Więc ze względu na konwencje boksu dla 'Nullable <>' wspomniałeś o sobie, zwrócone pole z tej metody nie może być typu 'Nullable <>'. –
PetSerAl - tak, ponieważ typy nie pasują. Przepraszam, może nie tak oczywiste, jak myślałem! –