2017-09-15 39 views
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通用版本是這樣的:

MyDerived1 derived1; 
MyDerived2 derived2; 

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

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

現在你可以通過這種方式使用它

通用函數返回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); 
     } 
    } 
相關問題