Как привести ViewModel к другой ViewModel? - PullRequest
1 голос
/ 10 октября 2011

У меня есть две модели ViewModel, которые похожи, и мне нужно привести одну к другой.

Это первый:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TestInheritance.Models
{
    public class ShowMatrixQuestionViewModel : ShowQuestionViewModel
    {
        public Dictionary<MatrixRows, List<MatrixColumns>> columnrow;
        public List<MatrixColumns> columns;
        public List<MatrixRows> rows;

        public ShowMatrixQuestionViewModel()
        {
            columns = new List<MatrixColumns>();
            rows = new List<MatrixRows>();
            columnrow = new Dictionary<MatrixRows, List<MatrixColumns>>();
        }
    }

    public class MatrixColumns
    {
        public int Column_ID { get; set; }
        public int Column_Number { get; set; }
        public String Column_Description { get; set; }
        public Boolean IsAnswer { get; set; }
        public int Procent { get; set; }
    }

    public class MatrixRows
    {
        public bool Delete { get; set; }
        public int Row_Id { get; set; }
        public String Row_Number { get; set; }
        public String Row_Description { get; set; }
    }

}

Второй выглядит следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TestInheritance.Models.ViewModels.New
{
    public class ShowMatrixProcentViewModel : ShowMatrixQuestionViewModel
    {
        // Dette er for at vi kan bruge DisplayTemplates
        public ShowMatrixProcentViewModel()
            : base()
        {
        }
    }
}

Когда я пытаюсь привести ShowMatrixQuestionViewModel к ShowMatrixProcentViewModel, я получаю InvalidCastException:

MatrixColumns mc = new MatrixColumns()
            {
                Column_Description = "Hej",
                Column_ID = 1,
                Column_Number = 1,
                IsAnswer = false
            };

            MatrixColumns mc2 = new MatrixColumns()
            {
                Column_Description = "Med",
                Column_ID = 1,
                Column_Number = 1,
                IsAnswer = false
            };

            MatrixRows mr = new MatrixRows()
            {
                Row_Description = "2005",
                Row_Id = 1,
                Row_Number = "1"
            };

            MatrixRows mr2 = new MatrixRows()
            {
                Row_Description = "2008",
                Row_Id = 1,
                Row_Number = "2"
            };

            List<MatrixColumns> matrixcolumns = new List<MatrixColumns>();
            matrixcolumns.Add(mc);
            matrixcolumns.Add(mc2);
            List<MatrixRows> matrixrows = new List<MatrixRows>();
            matrixrows.Add(mr);
            matrixrows.Add(mr2);

            ShowMatrixQuestionViewModel avm = new ShowMatrixQuestionViewModel()
            {
                IsAnswered = true,
                Question_ID = 1,
                Question_Number = "1",
                Question_Type = "hej",
                Question_Wording = "spørgsmål1",
                Visible = true,
                columns = matrixcolumns,
                rows = matrixrows
            };

            ShowMatrixProcentViewModel sm = (ShowMatrixProcentViewModel)avm;

return View(avm);

Исключение говорит:

System.InvalidCastException: Невозможно привести объект типа 'TestInheritance.Models.ShowMatrixQuestionViewModel' к типу 'TestInheritance.Models.ViewModels.New.ShowMatlProcentViewM.

Нужно ли мне инициализировать некоторые вещи в ShowMatrixProcentViewModel, прежде чем я смогу разыграть ??

Заранее спасибо

Ответы [ 4 ]

4 голосов
/ 10 октября 2011

Поскольку ShowMatrixProcentViewModel наследуют от ShowMatrixQuestionViewModel, вы не можете просто привести их из ShowMatrixQuestionViewModel к ShowMatrixProcentViewModel.Это основной ОО.Вы можете использовать только в направлении подкласс> суперкласс.Причина в том, что ShowMatrixQuestionViewModel не содержит всего, что делает ShowMatrixProcentViewModel.

Вы можете использовать что-то вроде AutoMapper, но вам, вероятно, следует вместо этого взглянуть на свой дизайн / архитектуру, поскольку что-то подобное является признаками плохой структуры.

4 голосов
/ 10 октября 2011

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

Вы можете приводить объект только к типу, который на самом деле равен .(Или с помощью пользовательского явного приведения).

Вместо этого вы можете использовать такую ​​библиотеку, как AutoMapper , чтобы создать одну из другой.

0 голосов
/ 10 октября 2011

Кроме того, к комментариям, сделанным другими, если вы хотите построить одну модель представления из другой, я бы использовал внедрение зависимости конструктора:

OrderViewModel orderViewModel = new OrderViewModel(CustomerViewModel customerViewModel);

Это не здорово, но я думаю, это то, что вы просите.

Кроме того, плохая идея наследовать от конкретного класса - в будущем будет трудоемко / сложно вносить изменения.

0 голосов
/ 10 октября 2011

Вы можете разыграть ShowMatrixProcentViewModel в ShowMatrixQuestionViewModel, но не наоборот:

ShowMatrixProcentViewModel p = new ShowMatrixProcentViewModel();

ShowMatrixQuestionViewModel q = p; //downcast: not need cast operator

ShowMatrixQuestionViewModel p1 = new ShowMatrixProcentViewModel();

ShowMatrixProcentViewModel p2 = (ShowMatrixProcentViewModel)p1; //upcast: need cast operator

ShowMatrixQuestionViewModel q1 = new ShowMatrixQuestionViewModel();

ShowMatrixProcentViewModel p3 = (ShowMatrixProcentViewModel)q1; //throws an exception
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...