繁体   English   中英

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

[英]c# given instance of base class, update base class properties of derived class

我有一个继承基类的视图模型(使用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网格,并且它不能处理复杂的类。

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

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.TaskTypeDescription。 但是,如果名称不完全匹配,或者您需要对数据进行某种处理(例如将字符串强制转换为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获取值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM