2016-12-15 2 views
0

私はDriverStaisticというモデルを持っていて、それを継承したビューモデル ビューモデルには余分なプロパティが含まれていません。それはDriverStaisticの空の継承です。私は外部ライブラリからモデルオブジェクトを受け取り、結合を最小限に抑えたいと思っています。 ベースクラスとサブクラスに同じプロパティが含まれているので、ラムダ式を使用する以外に、プロパティを追加または削除するたびに変更する必要があります。ベースモデルをサブビューモデルに変換する

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... 
} 

このアプローチの欠点は、あなたがコンパイル時にすべてのプロパティ名を知っているし、いつでもマッパーメソッドを変更しなければならないことは明らかですいずれかのクラスからプロパティが追加、削除、または名前変更されます。

もう1つの選択肢はリフレクションを使用することですが、この欠点は、コンパイル時の安全性とパフォーマンスを失うことです。

あなたはトレードオフの決定をする必要があります。設定されるプロパティがわずかしかない場合、リフレクションを使用するために支払う価格はそれほど高くはありません。また、いくつかの異なるビューモデル/モデルタイプマッピングに対して同じメソッドまたはロジックを再利用できるようにする必要があります。ですから、柔軟性が必要な場合は、反射を使用してください。パフォーマンスとコンパイル時の安全性が重要な場合は、実行しないでください。

+0

確かにラムダ式を逆に使ったほうがいいとは言えませんが、ラムダ式の優れた性能を利用できました – Scarnet

+0

パフォーマンスと柔軟性のどちらかを選択する必要があります:) – mm8

関連する問題