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

时间:2013-07-31 18:01:26

标签: c# asp.net-mvc-4 inheritance

我有一个继承基类

的视图模型(使用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,它无法处理复杂的类。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

var entity = Mapper.Map(viewModel);

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

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

答案 2 :(得分: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获取值。