2009-01-22 20 views
3

我們假設我們有一個Model,其上有幾個屬性,我們想創建這個模型的裝飾類,以增強它的一些額外屬性。現在,我們要創建的Model的所有屬性值填充,可能使用一個構造函數DecoratedModel的新實例Model作爲參數:挑戰:快速填充裝飾類的字段

public class DecoratedModel : Model 
{ 
    public DecoratedModel(Model baseModel) 
    { 
     // Populate decorated model generically from baseModel 
    } 
} 

什麼是填充DecoratedModel最通用的,簡潔的方式從Model

回答

5

那麼,你應該能夠使用反射來反映基類的屬性,然後用它來設置子類的屬性。我還沒有廣泛地測試過,但類似這樣的東西可能會起作用:

 public DecoratedModel(Model m) 
     { 
      foreach (var prop in typeof(Model).GetProperties()) 
      { 
       this.GetType().GetProperty(prop.Name).SetValue(this, prop.GetValue(m, null),null); 
      } 
     } 
2

雖然它確實需要Model類有一個拷貝構造函數來拷貝Decorator類中的Model數據,但這樣做至少可以確保對於所有裝飾器,您只需調用基類拷貝構造函數。

public class DecoratedModel : Model 
{ 
    public DecoratedModel(Model baseModel) 
     : base(baseModel) 
    { 
     // Populate decorated model generically from baseModel 
    } 
} 

public class Model 
{ 
    public Model(Model copy) 
    { 
     this.x = copy.x; 
     // etc. 
    } 
}