C# 如何将一个ViewModel强制转换为另一个ViewModel?
我有两个相似的ViewModels,我需要将它们转换为另一个 这是第一个: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
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:)我还有一个未回答的问题在:-你认为吗你能帮忙吗?