2016-12-15 75 views
0

我有一個名爲DriverStaistic的模型和從它繼承的視圖模型 視圖模型不包含任何額外的屬性它只是一個空的繼承DriverStaistic,我這樣做的原因是我從外部庫接收模型對象,我想保持耦合到最低限度。 由於基礎和子類包含相同的屬性我想知道如果我們有一個簡單的方法來轉換它們之間的轉換,而不是使用lambda表達式,這需要我每次添加或省略屬性時都要修改它將基礎模型轉換爲子視圖模型

I已經使用反思提出了這個解決方案,但我相信它會在將來出現性能問題。 任何人都可以有更好的建議嗎?

public static void FromDriverStatistic(this DriverStatisticsVm viewModel, object model) 
{ 
    bool isDriverStatistic = model is DriverStatistic; 

    if(!isDriverStatistic) 
     throw new InvalidCastException(); 

    var modelProperties = model.GetType().GetProperties(); 
    foreach (var property in modelProperties) 
    { 
     property.SetValue(viewModel, property.GetValue(model)); 
    } 
} 
+0

「我從外部庫收到模型對象,我想保持耦合到最低限度」,這導致需要做這樣的骯髒的黑客? – Will

回答

0

我一直在使用反射出來的這種解決方案,但我相信它會在將來出現的性能問題。任何人都可以有更好的建議嗎?

該選項用來設置的所有屬性逐一,即:

public static void FromDriverStatistic(this DriverStatisticsVm viewModel, DriverStatistic model) 
{ 
    viewModel.PropertyA = model.PropertyA; 
    viewModel.PropertyB = model.PropertyB; 
    //and so on... 
} 

這種方法的缺點是很明顯,你必須知道在編譯時的所有屬性名稱和修改映射器的方法,只要從任何一個類中添加,刪除或重命名一個屬性。

另一種選擇是使用反射,但缺點是你失去了編譯時的安全性和一些性能。

您需要作出權衡決定。如果只有幾個屬性需要設置,您使用反射支付的價格將不會那麼高。您還應該能夠爲幾個不同的視圖模型/模型類型映射重新使用相同的方法或邏輯。所以如果你想要靈活性,堅持使用反射。如果性能和編譯時安全性至關重要,則不要。

+0

當然,這不比使用lambda表達式更好,相反,我可以使用lambda表達式的一些不錯的性能 – Scarnet

+0

您需要在性能和靈活性之間進行選擇:) – mm8