2017-09-15 5 views
1

Ich habe eine Anzahl von Klassen, die von einer abstrakten Klasse abgeleitet sind. In einer Methode erhalte ich ein Objekt, das eine der abgeleiteten Klassen ist. Ich muss den Typ eines Objekts überprüfen und einer korrekten Eigenschaft zuweisen. Die einfache Lösung funktioniert, sieht aber so aus, als könnte sie refaktoriert werden. Ich weiß nicht, wie es zu nähern, aber:C# Refactoring: Überprüfen Sie den Typ der abgeleiteten Klasse und weisen Sie sie einer Variablen derselben Klasse zu

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

Warum nicht das ‚ist‘ Stichwort? Sehen Sie hier für weitere Informationen: https://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.110).aspx –

+0

Sie könnten nur eine Reihe von Anweisungen wie 'abgeleitete1 = Entität als MyDerived1;' – DavidG

Antwort

2

Sie können generische Version von AssignValue wie folgt erstellen:

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

jetzt können Sie es auf diese Weise verwenden:

MyDerived1 derived1; 
MyDerived2 derived2; 

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

Generische Funktion gibt bool zurück, um ausstehende Typüberprüfungen beim ersten Abgleich zu überspringen

+0

Das wird funktionieren, aber es fühlt sich an wie ein hässlicher Hack. – DavidG

0

vielleicht Suchen Sie etwas wie folgt aus:

public void AssignValue(MyBaseClass entity) 
    { 
     var item = this.GetType().GetFields().FirstOrDefault(x => x.FieldType == entity.GetType()); 
     if (item != null) 
     { 
      item.SetValue(this, entity); 
     } 
    } 
Verwandte Themen