如何将ViewModel转换为另一个ViewModel?

时间:2011-10-10 12:10:13

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-2

我有两个相似的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.ShowMatrixProcentViewModel”。

在我可以投射之前,我是否需要在ShowMatrixProcentViewModel中初始化一些东西?

提前致谢

4 个答案:

答案 0 :(得分:4)

你不能在两种不相关的类型之间进行转换,即使它们是相似的。

您只能将对象强制转换为实际 的类型。 (或使用自定义显式转换)。

相反,您可以使用像AutoMapper这样的库来创建另一个库。

答案 1 :(得分:4)

由于ShowMatrixProcentViewModel继承自ShowMatrixQuestionViewModel,因此您无法从ShowMatrixQuestionViewModel转换为ShowMatrixProcentViewModel。这是基本的OO。你只能在子类中施放&gt;超级方向。原因是ShowMatrixQuestionViewModel不包含ShowMatrixProcentViewModel所做的所有事情。

你可以使用像AutoMapper这样的东西,但你应该看看你的设计/架构,因为这样的东西是结构不好的迹象。

答案 2 :(得分:0)

您可以在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

答案 3 :(得分:0)

此外,对于其他人所做的贡献,如果你想从另一个构建一个视图模型,那么我将使用构造函数依赖注入:

OrderViewModel orderViewModel = new OrderViewModel(CustomerViewModel customerViewModel);

这不是很好,但我想这就是你所要求的。

从一个具体的类继承也是一个坏主意 - 将来进行更改将非常耗时/困难。