2017-11-10 20 views
1

私はClass1Model初期化ビューモデル

Class1Model model = GetClass1Model(); 

を返す関数を持っている私も、私はいくつかの書式設定のための唯一のプロパティを取得追加したためにClass1Modelから継承Class1ViewModelを持っていますビューで。

public class Class1ViewModel : Class1Model 
{ 
    public string MyFormattedProperty => $"{base.Height:###.00} x {base.Width:###.00}" 
} 

だから私は、私はこれを行うことができることを期待していた:

Class1Model model = GetClass1Model(); 
var viewModel = model as Class1ViewModel; 

しかし、これは

を動作しませんので、どのようにこれは通常行われるのでしょうか?

+0

あなたのオブジェクトは 'Class1ViewModel'ではありません。それは 'Class1Model'です。 'Class1ViewModel'が必要な場合は、メソッドから1つ返す必要があります。 – Amy

+1

継承の代わりに合成? – grek40

+1

私にクローニングするように聞こえます。基本クラスをシリアライズし、**継承する**逆直列化します。 – Sinatr

答えて

2

を私は、組成アプローチの代わりに、継承を示唆しています。

class Class1Model 
{ 
    // model properties 
} 

class Class1ViewModel 
{ 
    public Class1ViewModel(Class1Model model) 
    { 
     _Model = model; 
    } 

    private Class1Model _Model; 
    public Class1Model Model { get { return _Model; } } 

    // viewmodel specific extensions 

    public string MyFormattedProperty => $"{Model.Height:###.00} x {Model.Width:###.00}" 
} 

あなたのモデルプロパティを変更することが予想される場合、あなたには、いくつかの弱いイベントリスナーでプロパティの変更をモデル化するためにサブスクライブし、適切なプロパティを発行する必要があり、依存のviewmodelプロパティのイベントを変更しました。

0

基本タイプのインスタンスを許可されていないサブタイプにキャストしようとしています。

Class1ViewModelはClass1Modelです。その逆ではありません。

だから、これは動作します:

Class1ViewModel viewModel = new Class1ViewModel(); 
Class1Model model = viewModel; 
+0

基本型にキャストすることは可能ですが、最初にモデルを指定する問題の問題は解決しません。 – grek40

+0

「必然」という言葉はIMOがうまく選ばれていません。基本クラスは決してそのサブクラスの1つではありません。コンバージョン演算子があるかもしれませんが、それは特殊な特殊ケースです(通常はコンバージョン演算子の有効利用とはみなされません)。 –

+0

うーん。彼はサブタイプの新しいインスタンスを作成する必要があります。私はそれが自明であると思った。 – Skyuppercut

0

一般的に意味がないので(this answerを読んでください)、の一般的なソリューションを提供するのは良い考えです。

あなたは必ず1つを持つことができます。シリアル化のトリックを経由してクローニングを経て:

using Newtonsoft.Json; 

class Base 
{ 
    public string A; 
    public string B; 
} 

class Inherited : Base 
{ 
    public string C = "c"; 
} 

// in some method 
var @base = new Base { A = "a", B = "b" }; 
var inherited = JsonConvert.DeserializeObject<Inherited>(JsonConvert.SerializeObject(@base)); 

inherited@base値を持つことになりますコピーして自分の値がデフォルトになります(私も性質のために働く必要があり、フィールドを使用しました)。

これは非常に遅いアプローチです。

var @base = new Base { A = "a", B = "b" }; 
var inherited = new Inherited { A = @base.A, B = @base.B, C = "whatever" };