2016-07-21 20 views
0

Ich arbeite gerade an einer Lösung, um zwei Elemente des gleichen Objekts miteinander zu vergleichen. -Code sieht wie folgt aus:Gleiche Funktion für verschiedene generische Typen mit Reflektion implementieren

public double Compare(Data o) 
    { 
     double same = 0; 
     double different = -1; 

     foreach (var prop in o.GetType().GetProperties()) 
     { 
      if (prop.GetValue(o) == prop.GetValue(this)) 
       same++; 
      else 
       different++; 
     }    
     return (same/(different + same)) * 100; 
    } 

Daten ein Beispiel für eine Implementierung der IData Schnittstelle ist, durch meine eigene erstellt. Da es mehr Typen verschiedener Datenstrukturen gibt, gibt es identische Implementierungen der Funktion in jedem Objekt, das die bestimmte Schnittstelle implementiert. Nun stört mich das irgendwie, denn es scheint dumm zu sein, genau die gleichen Codezeilen in verschiedenen Klassen zu haben.

Gibt es eine Chance, dass ich eine Methode für alle meine verschiedenen Klassen verwenden und immer noch mit Reflektion arbeiten kann? Ich habe eine Weile über das Szenario nachgedacht und konnte mir einfach nicht vorstellen, wie ich auf die richtige "diese" Referenz eingehen soll. Die einzige Idee, die ich habe, ist, eine Hilfsklasse mit zwei Parametern für die Funktion zu schreiben und diese Hilfsmethode in der spezifischen Datenaufrufimplementierung aufzurufen. -Code würde wie folgt aussehen:

class CompareHelper 
{ 
    public double Compare(Data o, Data callingObject) 
    { 
     double same = 0; 
     double different = -1; 

     foreach (var prop in o.GetType().GetProperties()) 
     { 
      if (prop.GetValue(o) == prop.GetValue(callingObject)) 
       same++; 
      else 
       different++; 
     } 
     return (same/(different + same)) * 100; 
    } 
} 

Jede andere Empfehlungen?

Vielen Dank im Voraus!

Antwort

0

Ich weiß nicht, warum ich es selbst herausfinden könnte. Ich arbeite jetzt mit einer abstrakten Klasse, die die Compare-Methode implementiert (wie oben angegeben) und alle verschiedenen Arten sind Spezialisierungen der Basisklasse "Data".

Verwandte Themen