向模型添加其他数据(向下转换?)

时间:2014-02-19 15:15:48

标签: c# asp.net-mvc polymorphism

我在实体框架中使用了以下实体模型:

public class User {
    public int    Id    { get; set; }
    public string Name  { get; set; }
    public string EMail { get; set; }
}

现在我正在尝试向用户显示视图(WPF中的MVVM,ASP.NET中的MVC ......),以及数据库中不可用的其他信息,但可以在运行时获取来自服务。

为此,我创建了一个派生模型类:

public class UserDetail : User {
    public bool IsOnline { get; set; }
}

现在有一些乱码描述了我想要实现的目标:

var users = _myContext.Users
               .ToList()
               .Select(x => new UserDetail() {
                         IsOnline = _myUserService.IsOnline(x.Id)
                     } = (UserDetail)x); // downcast x (User) to the new UserDetail instance
return View["MyView", users];

现在,向下转换在C#中不起作用..我还有其他选择来实现我想要的吗?

3 个答案:

答案 0 :(得分:1)

您可以通过复制将构造函数添加到UserDetail。

public class UserDetail : User
{
    public UserDetail(User x)
    {
        this.Id = x.Id;
        this.Name = x.Name;
        this.EMail = x.EMail;
    }

    public bool IsOnline { get; set; }
}

(如果你有很多具有这种行为的类,那么T4可以生成那种构造函数)

然后,更改你的linq并使用该构造函数:

var users = _myContext.Users
           .ToList()
           .Select(x => new UserDetail(x) {
                     IsOnline = _myUserService.IsOnline(x.Id)
                 });
return View["MyView", users];

答案 1 :(得分:0)

不,您必须逐个复制属性,或者编写一些代码来为您完成。

答案 2 :(得分:0)

创建单独的视图模型。您不应扩展实体模型以适应视图所需的属性。然后,您可以像zahorak建议的那样逐个复制属性,也可以使用专门为此任务创建的库,如AutoMapper