2014-02-19 4 views
1

я получил следующую модель объекта, который я использую в Entity Framework:Добавить дополнительные данные модели (? Понижающее приведение)

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

Теперь я пытаюсь показать пользователю на вид (MVVM в WPF, MVC в ASP.NET ...), но вместе с другой информацией, которая недоступна внутри базы данных, но может быть извлечена во время выполнения из службы.

Для этого я создал производный класс модели:

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# .. есть ли у меня другие возможности для достижения того, что я хочу?

ответ

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

(такого род конструктор может быть порожден Т4, если у вас есть много класса с этим поведением)

затем изменить ваш LINQ и использовать этот конструктор:

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

Нет, вам нужно скопировать свойства по одному или написать код, который сделает это за вас.

0

Создайте отдельную модель просмотра. Вы не должны расширять модели сущностей, чтобы они соответствовали свойствам, требуемым вашим представлением. Затем вы можете копировать свойства один за другим, как предложил zahorak, или использовать библиотеку, специально разработанную для этой задачи, например, AutoMapper.

Смежные вопросы