计算automapper映射中的日期时间差异(UseValue)

时间:2016-09-14 11:49:20

标签: c# datetime automapper

我有情况需要知道两个日期之间的差异。我想在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;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

viewModelCreatedAt我定义了 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]) { }

2 个答案:

答案 0 :(得分:1)

第一个问题是拼写错误:您键入了conf.CreatedAtconf不是您的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;
    }