取消装箱可空类型 - 解决方法?

Kie*_*one 6 c#

我正在存储更新操作:

class Update
{
    public Expression MemberExpression { get; set; }
    public Type FieldType { get; set; }
    public object NewValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

例如:

var myUpdate = new Update
{
    MemberExpression = (MyType o) => o.LastModified,
    FieldType = typeof(DateTime?),
    NewValue = (DateTime?)DateTime.Now
}
Run Code Online (Sandbox Code Playgroud)

然后我试图稍后应用此更新(简化):

var lambda = myUpdate.MemberExpression as LambdaExpression;
var memberExpr = lambda.Body as MemberExpression;
var prop = memberExpr.Member as PropertyInfo;
prop.SetValue(item, myUpdate.Value);
Run Code Online (Sandbox Code Playgroud)

但是,myUpdate.Value是一个DateTime,而不是一个DateTime?.这是因为当你将一个可空值转换为a时object,它会变为null或包装值类型.

因为它(DateTime?)myUpdate.Value会使它恢复到正确的类型,我尝试使用模拟这个编译时构造Convert.ChangeType.然而,它说,从铸造DateTimeDateTime?是不可能的.

我可以在这里使用什么方法将对象恢复为原始类型?

有没有办法在一个字段中存储可以为空的类型,常规结构和常规对象,并获得存储在其中的确切内容?

Dav*_*d L 1

如果您在创建 myUpdate 时知道表达式的类型,SetInfo()将正确设置您的数据,即使装箱/拆箱也是如此。

public class Update
{
    public Expression MemberExpression { get; set; }
    public Type ClassType { get; set; }
    public object NewValue { get; set; }
}

public class MyType
{
    public DateTime? LastModified { get; set; }
}

void Main()
{
    var myUpdate = new Update
    {
        MemberExpression = 
            (Expression<Func<MyType, DateTime?>>)((MyType o) => o.LastModified),
        ClassType = typeof(MyType),
        NewValue = DateTime.Now
    };

    // At a later point where we do not want to instantiate via strong typing
    var item = Activator.CreateInstance(myUpdate.ClassType);

    var lambda = myUpdate.MemberExpression as LambdaExpression;
    var memberExpr = lambda.Body as MemberExpression;
    var prop = memberExpr.Member as PropertyInfo;

    prop.SetValue(item, myUpdate.NewValue);

    item.Dump();
}
Run Code Online (Sandbox Code Playgroud)

这会正确输出与创建时间相对应的日期时间值,没有异常。