2

我有一个继承基类的视图模型(使用 MVC4)

public class TimeTaskViewModel : TimeDetailTask
{
    public string TaskTypeDescription { get; set; }

}

给定该类的实例,我有一种将视图模型转换为类的方法。我希望能够这样做,以便不必显式设置基类的每个属性,然后只需更新视图模型的附加属性:

public TimeTaskViewModel ConvertClassToViewModel(TimeDetailTask entity)
{
    TimeTaskViewModel viewModel = new TimeTaskViewModel();

    viewModel.base = entity; 
    viewModel.TaskTypeDescription = entity.TaskTypes.TaskTypeDescription;
    return viewModel;
}

无论如何要这样做?还是我离这里很远?

注意:我需要一个平面类,因为视图模型也将以 IEnumerable 格式用于传递给前端的 Kendo UI Grid,它不能处理复杂的类。

4

3 回答 3

3

不,它不能完全按照你的要求完成。以下是一些选项:

1:更改您的TimeTaskViewModel类以包含 aTimeDetailTask而不是扩展它。

public class TimeTaskViewModel
{
    public TimeDetailTask TimeDetailTask { get; set; }
    public string TaskTypeDescription { get; set; }
}

2:创建一个TimeTaskViewModel(TimeDetailTask)构造函数并在那里手动复制属性。

public class TimeTaskViewModel : TimeDetailTask
{
    public string TaskTypeDescription { get; set; }
    public TimeTaskViewModel(TimeDetailTask baseTask)
    {
        this.SomeProperty = baseTask.SomeProperty;
        // and so on
    }
}

3:使用AutoMapper、反射或类似的东西将属性从一个复制到另一个。

Mapper.CreateMap<TimeDetailTask, TimeTaskViewModel>();

// Perform mapping

TimeTaskViewModel viewModel = 
                       Mapper.Map<TimeDetailTask, TimeTaskViewModel>(baseTask);
于 2013-07-31T18:09:09.210 回答
2

听起来您正在寻找一种简单的方法来将信息从一个类映射到恰好具有某些相同属性的完全不同的类。我不认为继承是你正在寻找的答案。听起来您想要AutoMapper 之类的东西,它允许您设置将属性从一个对象映射到另一个对象的规则。

例如,如果您在写入数据库之前尝试从视图模型映射到数据库实体,您可以执行以下操作:

var entity = Mapper.Map(viewModel);

对于属性名称中的直接匹配,AutoMapper 已经处理好了,例如将 TimeTaskViewModel.TaskTypeDescription 复制到 YourEntity.TaskTypeDescription。但是,如果名称不完全匹配,或者您需要对数据进行一些操作(例如将字符串转换为 int),您可以在映射文件中为其设置规则。

在我看来,当您使用 AutoMapper 将具有一个属性名称的类中的内容复制到具有完全相同属性名称的另一个类时,它是一个很棒的工具。当您需要在不同命名的属性之间复制相同的数据类型或执行非常简单的转换(例如 int 到 string)时,它仍然是一个不错的工具。但是,如果您进行复杂的转换是值得的(主要是因为我发现很难调试和对映射文件进行单元测试),那么它开始感觉更麻烦,此时您通常觉得您应该只编写自己的映射函数. 当然,没有什么说你不能将它用于简单的情况,并为更复杂的情况滚动你自己的映射函数。

于 2013-07-31T18:08:02.927 回答
0

尝试这个

//在TimeTaskViewModel类中为TimeDetailTask​​创建一个属性

public class TimeTaskViewModel : TimeDetailTask
{
    public string TaskTypeDescription { get; set; }

   public TimeDetailTask TimeDetailTaskProperty { get; set; }
}

//Then you assign the entity values to modelclass  TimeDetailTaskProperty 

public TimeTaskViewModel ConvertClassToViewModel(TimeDetailTask entity)
{
    TimeTaskViewModel viewModel = new TimeTaskViewModel ();    
    viewModel.TimeDetailTaskProperty =entity;
    return viewModel;
}

//最后你可以TimeDetailTaskProperty 使用TimeTaskViewModel object.

于 2013-07-31T18:16:43.013 回答