che sto memorizzare un'operazione di aggiornamento come così:Unboxing tipi nullable - soluzione alternativa?
class Update
{
public Expression MemberExpression { get; set; }
public Type FieldType { get; set; }
public object NewValue { get; set; }
}
Ad esempio:
var myUpdate = new Update
{
MemberExpression = (MyType o) => o.LastModified,
FieldType = typeof(DateTime?),
NewValue = (DateTime?)DateTime.Now
}
Poi sto cercando di applicare questo aggiornamento successivo (semplificato):
var lambda = myUpdate.MemberExpression as LambdaExpression;
var memberExpr = lambda.Body as MemberExpression;
var prop = memberExpr.Member as PropertyInfo;
prop.SetValue(item, myUpdate.Value);
Tuttavia, myUpdate.Value
è un DateTime
, non un DateTime?
. Questo perché quando si esegue il cast di un valore nullo su un valore object
, diventa null
o il tipo di valore.
Poiché (DateTime?)myUpdate.Value
avrebbe funzionato per riportarlo al tipo corretto, ho provato a simulare questo costrutto in fase di compilazione utilizzando Convert.ChangeType
. Tuttavia, si dice che il casting da DateTime
a DateTime?
non è possibile.
Quale approccio posso utilizzare qui per riportare l'oggetto nel suo tipo originale?
C'è un modo per memorizzare tipi nullable, strutture normali e oggetti regolari in un singolo campo e ottenere di nuovo l'esatta cosa memorizzata?
Qual è il tuo problema? 'Prop.SetValue (item, myUpdate.Value);' genera qualche eccezione per te? – PetSerAl
Come puoi sperare che il metodo 'Convert.ChangeType' possa essere utile? È un metodo non generico il cui tipo di reso dichiarato è 'object'. Quindi, a causa delle convenzioni di boxing per 'Nullable <> 'che dici di te stesso, la casella restituita da quel metodo non può essere di tipo' Nullabile <> '. –
PetSerAl - sì, poiché i tipi non corrispondono. Scusa, forse non così ovvio come pensavo! –