2011-10-10 78 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); 

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

此外,從具體的類繼承是一個壞主意 - 將來很難做出更改。

相關問題