gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:53:43 25 4
gpt4 key购买 nike

我这样存储一个更新操作:

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

例如:

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

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

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

但是,myUpdate.Value 是一个 DateTime,而不是 DateTime?。这是因为当您将 nullable 转换为 object 时,它要么变为 null 要么将值类型装箱。

由于 (DateTime?)myUpdate.Value 可以将其恢复为正确的类型,因此我尝试使用 Convert.ChangeType 模拟此编译时构造。但是,它说从 DateTime 转换为 DateTime? 是不可能的。

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

有没有办法在单个字段中存储可空类型、常规结构和常规对象,并再次将确切的内容重新存储到其中?

最佳答案

如果您在创建 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();
}

这正确地输出了一个 DateTime 值,对应于它的创建时间,没有异常。

关于c# - 取消装箱可空类型 - 解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30404238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com