我正在存储更新操作:
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.然而,它说,从铸造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();
}
Run Code Online (Sandbox Code Playgroud)
这会正确输出与创建时间相对应的日期时间值,没有异常。
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |