2017-09-15 8 views
1

私は抽象クラスから派生したいくつかのクラスを持っています。あるメソッドでは、派生クラスの1つであるオブジェクトを受け取ります。私は、オブジェクトのタイプをチェックし、正しいプロパティに割り当てる必要があります。単純な解決策は機能しますが、リファクタリングできるように見えます。でも、私はそれにアプローチする方法がわからない:C#リファクタリング:派生クラスの型をチェックし、同じクラスの変数に割り当てます。

public MyDerived1 derived1; 
    public MyDerived2 derived2; 
    // .... 
    public MyDerivedX derivedX; 

    public void AssignValue(MyBaseClass entity) 
    { 
     var derivedOne = entity as MyDerived1; 
     if (derivedOne != null) 
     { 
      derived1 = derivedOne; 
      return; 
     } 

     var derivedTwo = entity as MyDerived2; 
     if (derivedTwo != null) 
     { 
      derived2 = derivedTwo; 
      return; 
     } 

     // .... 

     var derivedEx = entity as MyDerivedX; 
     if (derivedEx != null) 
     { 
      derivedX = derivedEx; 
      return; 
     } 
    } 
+1

なぜ「is」というキーワードを使用しませんか?詳細についてはこちらを参照してください。https://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.110).aspx –

+0

「derived1 = entity as MyDerived1;」のような文がたくさんあります。 – DavidG

答えて

2

をあなたはこのようAssignValueのジェネリック版を作成することができます。

private static bool AssignValue<T>(MyBaseClas entity, out T derived) where T : MyBaseClas 
{ 
    var t = entity as T; 
    if (t == null) 
    { 
     derived = null; 
     return false; 
    } 

    derived = t; 
    return true; 
} 

今、あなたはこの方法でそれを使用することができます。

MyDerived1 derived1; 
MyDerived2 derived2; 

var _ = AssignValue(entity, out derived1) 
    || AssignValue(entity, out derived2); 

汎用関数はboolを返して、最初の一致で保留中の型チェックをスキップします

+0

これは動作しますが、厄介なハッキングのように感じます。 – DavidG

0

多分あなたはそのようなものをお探しですか?

public void AssignValue(MyBaseClass entity) 
    { 
     var item = this.GetType().GetFields().FirstOrDefault(x => x.FieldType == entity.GetType()); 
     if (item != null) 
     { 
      item.SetValue(this, entity); 
     } 
    } 
関連する問題