c给定基类的实例,更新派生类的基类属性

本文关键字:基类 派生 属性 更新 实例 | 更新日期: 2023-09-27 18:25:38

我有一个视图模型(使用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;
}

无论如何要这么做?还是我离基地太远了?

注意:因此,我需要一个平面类,因为视图Model也将以IEnumerable格式使用,以传递到前端的Kendo UI网格,并且它不能处理复杂的类。

c给定基类的实例,更新派生类的基类属性

不,不能完全按照您的要求进行。以下是一些选项:

1:将TimeTaskViewModel类更改为包含TimeDetailTask,而不是扩展它。

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);

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

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

var entity = Mapper.Map(viewModel);

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

在我看来,当你使用AutoMapper将事物从一个具有一个属性名的类复制到另一个具有完全相同属性名的类时,它是一个很好的工具。当您需要在不同名称的属性之间复制相同的数据类型,或者执行非常简单的转换(如int到string)时,它仍然是一个不错的工具。然而,如果你正在进行复杂的转换,当它值得的时候,它开始感觉像是更多的麻烦(主要是因为我发现很难调试和单元测试映射文件),在这一点上,你通常觉得应该只编写自己的映射函数。当然,没有什么可以说你不能在简单的情况下使用它,而在更复杂的情况下滚动你自己的映射函数。

试试这个

//在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;
}

//最后,您可以使用TimeTaskViewModel object从该TimeDetailTaskProperty中获取值。