2011-10-10 63 views
1

我有两个相似的ViewModel,我需要将其中一个投射到另一个。如何将ViewModel转换为另一个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中初始化一些东西,然后才能施放?

在此先感谢

+0

肯慈你应该接受一个答案。 –

+0

Tak为hjælpen:)我还有一个未回答的问题:http://stackoverflow.com/questions/7706288/why-isnt-my-editortemplate-binding-a-list-on-httppost-but-renders-it-fine - 你认为你可以帮忙吗? – Kenci

回答

4

由于ShowMatrixProcentViewModel继承自ShowMatrixQuestionViewModel,因此不能仅将ShowMatrixQuestionViewModel转换为ShowMatrixProcentViewModel。这是基本的OO。您只能在子类>超类方向投射。原因是ShowMatrixQuestionViewModel不包含ShowMatrixProcentViewModel所做的所有事情。

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

4

你不能投两种不相关的类型之间,即使它们是相似的。

您只能将物体投射到实际上的类型。 (或使用自定义显式演员)。

相反,您可以使用类似AutoMapper的库来创建另一个库。

+0

Kenci这是真的,但是当您执行演员时,您在代码中假设的是ShowMatrixQuestionViewModel是ShowMatrixProcentViewModel--而不是其他方式。 –

+0

是的,我的坏。我现在可以看到我的错误。 Thx很多家伙。 – Kenci

0

可以投在ShowMatrixQuestionViewModelShowMatrixProcentViewModel但不是反之亦然:

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 
0

此外,为他人所作的评析,如果你想建立一个视图模型出一个又一个的话,我会使用构造函数依赖注射:

OrderViewModel orderViewModel = new OrderViewModel(CustomerViewModel customerViewModel); 

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

此外,从具体的类继承是一个坏主意 - 将来很难做出更改。

相关问题