C# 如何将一个ViewModel强制转换为另一个ViewModel?

C# 如何将一个ViewModel强制转换为另一个ViewModel?,c#,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-2,C#,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 2,我有两个相似的ViewModels,我需要将它们转换为另一个 这是第一个: using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace TestInheritance.Models { public class ShowMatrixQuestionViewModel : ShowQuestionViewModel { public D

我有两个相似的ViewModels,我需要将它们转换为另一个

这是第一个:

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

}
当我尝试将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);
MatrixColumns mc=新的MatrixColumns()
{
Column_Description=“Hej”,
列_ID=1,
列号=1,
IsAnswer=false
};
MatrixColumns mc2=新的MatrixColumns()
{
列描述=“Med”,
列_ID=1,
列号=1,
IsAnswer=false
};
MatrixRows mr=新MatrixRows()
{
Row_Description=“2005”,
行Id=1,
行号=“1”
};
MatrixRows mr2=新MatrixRows()
{
Row_Description=“2008”,
行Id=1,
行号=“2”
};
List matrixcolumns=新列表();
矩阵列添加(mc);
矩阵列添加(mc2);
列表矩阵行=新列表();
矩阵行。添加(mr);
矩阵行。添加(mr2);
ShowMatrixQuestionViewModel avm=新的ShowMatrixQuestionViewModel()
{
IsAnswered=true,
问题_ID=1,
问题_Number=“1”,
问题_Type=“hej”,
问题_措辞=“spørgsmål1”,
可见=真,
列=矩阵列,
行=矩阵行
};
ShowMatrixProcentViewModel sm=(ShowMatrixProcentViewModel)avm;
返回视图(avm);
例外情况是:

System.InvalidCastException:无法将类型为“TestInheritance.Models.ShowMatrixQuestionViewModel”的对象强制转换为类型为“TestInheritance.Models.ViewModels.New.ShowMatrixProcentViewModel”

我是否需要初始化ShowMatrixProcentViewModel中的某些内容才能进行强制转换


提前感谢

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

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


相反,您可以使用类似于从另一个库中创建一个的库。

您不能在两个不相关的类型之间进行强制转换,即使它们是相似的

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


相反,您可以使用类似于从另一个库中创建一个库的库。

由于ShowMatrixProcentViewModel继承自ShowMatrixQuestionViewModel,因此不能仅从ShowMatrixQuestionViewModel强制转换为ShowMatrixProcentViewModel。这是基本的OO。只能在sub-class>super-class方向进行强制转换。原因是ShowMatrixQuestionViewModel并不像ShowMatrixProcentViewModel那样包含所有内容


您可以使用AutoMapper之类的工具,但您可能应该看看您的设计/体系结构,因为这是结构不良的标志。

由于ShowMatrixProcentViewModel继承自ShowMatrixQuestionViewModel,因此您不能仅从ShowMatrixQuestionViewModel转换为ShowMatrixProcentViewModel。这是基本的OO。只能在sub-class>super-class方向进行强制转换。原因是ShowMatrixQuestionViewModel并不像ShowMatrixProcentViewModel那样包含所有内容


您可以使用AutoMapper之类的工具,但您可能应该看看您的设计/架构,因为这样的工具是结构不良的标志。

您可以在
ShowMatrixQuestionViewModel
中使用
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

您可以在
showmarixquestionviewmodel
中强制转换
showmarixprocentviewmodel
,但不能反之:

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

此外,对于其他人提出的问题,如果您想用另一个视图模型构建一个视图模型,那么我将使用构造函数依赖项注入:

OrderViewModel orderViewModel = new OrderViewModel(CustomerViewModel customerViewModel);
这不太好,但我想这就是你想要的


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

此外,对于其他人的结果,如果您想用另一个视图模型构建一个视图模型,那么我将使用构造函数依赖项注入:

OrderViewModel orderViewModel = new OrderViewModel(CustomerViewModel customerViewModel);
这不太好,但我想这就是你想要的


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

Kenci这是真的,但是当您进行转换时,您在代码中的假设是ShowMatrixQuestionViewModel是ShowMatrixProcentViewModel,而不是反过来。Kenci这是真的,但您在代码中的假设是什么当你做演员时,一个ShowMatrixQuestionViewModel是一个ShowMatrixProcentViewModel,而不是相反。Kenci你应该接受一个答案。Tak代表hjælpen:)我还有一个未回答的问题在:-你认为你能帮忙吗?Kenci你应该接受一个答案。Tak代表hjælpen:)我还有一个未回答的问题在:-你认为吗你能帮忙吗?