我有情况需要知道两个日期之间的差异。我想在CreateMap<Post, ManagePostViewModel>()
.ForMember(d => d.ActiveInDays, conf => conf.UseValue((DateTime.UtcNow - (conf.CreatedAt)).TotalDays));
中这样做。
问题是我不知道这是可能的以及如何?
以下是示例代码:
conf.CreatedAt
我在静态值中测试了这种语法并且它有效。如果我使用model
,则会出现以下错误:
&#39; IMemberConfigurationExpression&#39;不包含&#39; CreatedAt&#39;的定义没有扩展方法&#39; CreatedAt&#39;接受类型&#39; IMemberConfigurationExpression&#39;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)
在viewModel
和CreatedAt
我定义了 var imag:UIImagePickerController?
print("Camera")
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera){
print("Button capture")
self.imag = UIImagePickerController()
self.imag!.delegate = self
self.imag!.sourceType = UIImagePickerControllerSourceType.Camera
self.imag!.cameraDevice = UIImagePickerControllerCameraDevice.Front
self.imag!.mediaTypes = [kUTTypeImage as String]
self.imag!.allowsEditing = false
self.presentViewController(self.imag!, animated: true, completion: nil)
}
print("Gallery")
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary){
print("Button capture")
self.imag = UIImagePickerController()
self.imag!.delegate = self
self.imag!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary;
//imag.mediaTypes = [kUTTypeImage];
self.imag!.allowsEditing = false
self.presentViewController(self.imag!, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
}
。
答案 0 :(得分:1)
第一个问题是拼写错误:您键入了conf.CreatedAt
。 conf
不是您的ViewModel,它是允许您创建映射表达式的IMemberConfigurationExpression
对象。
第二个问题是UseValue
仅用于计算一次值,因此它不提供对ViewModel的访问。您需要使用MapFrom
计算每个ViewModel的值。
最后一个问题是Automapper并不应该像那样工作。它应该将一个属性映射到另一个属性,而不是生成新值。计算持续时间的最佳位置是目标ViewModel。这样可以更轻松地更改和测试持续时间计算代码 lot 。
在当前方案中,您应该将CreatedAt
映射到ViewModel中的类似属性,并添加一个返回DateTime.UtcNow - CreatedAt).TotalDays
的只读属性。使用C#6语法,这将是一个简单的
public double ActiveInDays => (DateTime.UtcNow - conf.CreatedAt).TotalDays;
也许更好的选择是返回TimeStamp本身并在数据绑定中指定格式化字符串
public double ActiveDuration => DateTime.UtcNow - conf.CreatedAt;
这样您就可以将日期分数显示为小时,分钟等。
如果 在映射时执行计算,则应尝试:
.ForMember(model => model.ActiveInDays,
conf => conf.MapFrom(
model => (DateTime.UtcNow - model.CreatedAt).TotalDays
))
我认为使用只读属性显然更清晰。
<强>更新强>
如果要显示整天,则应使用Days属性而不是TotalDays
。
答案 1 :(得分:0)
您可以尝试使用ResolveUsing方法吗? Additional information
public MappingProfiles()
{
CreateMap<Post, ManagePostViewModel>().ForMember(d => d.ActiveInDays, conf => conf.ResolveUsing(CalculateActiveDays));
}
private static object CalculateActiveDays(Post arg)
{
return (DateTime.UtcNow - arg.CreatedAt).TotalDays;
}