2009-12-30 115 views
0

現在,我正在研究ASP.NET MVC 2.我剛剛發現了一些有關從Model項目中的基類派生的View Model類的嚴重問題。每當我從數據庫獲取數據時,我都必須將其轉換爲View Model實例,而這在大多數OOP語言中是不可能的。在C#4.0中,基類實例派生類實例的最佳方式是什麼?

基類

public class MyBaseClass 
{ 
    public string ID { get;set; } 
    public string Value { get;set; } 
} 

派生類

public class MyDerivedClass : MyBaseClass, ISomeInterface 
{ 
    // logic for My Derived Class 
} 

不過,我試圖創造一些方法,從基類的實例複製所有可讀屬性等衍生類的實例下面的代碼。

public static TDerived CastObject<TBase, TDerived>(TBase baseObj) 
{ 
    Type baseType = typeof(TBase); 
    Type derivedType = typeof(TDerived); 

    if (!baseType.IsAssignableFrom(derivedType)) 
    { 
     throw new Exception("TBase must be a parent of TDerived."); 
    } 

    TDerived derivedObj = Activator.CreateInstance<TDerived>(); 

    foreach (PropertyInfo pi in baseType.GetProperties()) 
    { 
     if (pi.CanRead) 
     { 
      PropertyInfo derivedProperty = derivedType.GetProperty(pi.Name); 

      if (derivedProperty.CanWrite) 
      { 
       derivedProperty.SetValue(derivedObj, pi.GetValue(baseObj, null), null); 
      } 
     } 
    } 

    return derivedObj; 
} 

但我不知道上面的代碼,將工作在大型網站的偉大,也有在C#4.0 DLR,我不知道很多功能。

你對使用C#4.0轉換項目有任何想法嗎?

感謝,

+0

您可能會解釋爲什麼要將所有值複製到派生類? – Bobby 2009-12-30 08:52:44

+0

因爲我有其他代碼檢查實例類型是否有一些接口,我不能修改基類,因爲它是生成的代碼的一部分。 – 2009-12-30 11:08:17

回答

1

有什麼理由基本類型不能有歷時一個實例中複製數據的構造?

public class MyBaseClass 
{ 
    public string ID { get;set; } 
    public string Value { get;set; } 

    public MyBaseClass() {} 

    public MyBaseClass(MyBaseClass other) 
    { 
     ID = other.ID; 
     Value = other.Value; 
    } 
} 


public class MyDerivedClass : MyBaseClass, ISomeInterface 
{ 
    public MyDerivedClass(MyBaseClass other) : base(other) 
    {   
    } 
} 

或者,你可以用組合而不是繼承來做到這一點嗎?你的派生類是否可以引用MyBaseClass的實例來獲取它的值和ID?

最後,你能否改變數據訪問層,以便它可以創建一個正確的類的實例開始?

+0

答案很簡單。但它不起作用,因爲基類是由VS 2010 B2上的EF 4.0的POCO模板生成的。 – 2009-12-30 11:09:45

+0

@Soul_Master:它是否生成爲部分類?如果是這樣,你可以在另一個文件中添加自己的構造函數。 – 2009-12-30 12:05:21

+0

這應該是非常糟糕的主意。因爲當生成的類中的屬性發生更改時,您必須在部分類中更改構造函數。這對我來說沒有意義。我認爲我現在的解決方案應該適用於大型項目,而不是解決方案。 – 2009-12-30 22:02:12

相關問題