Ich benutze ReSharper, um Gleichheitselemente zu erzeugen. Es implementiert optional IEquatable<T>
sowie Operator überschreiben, wenn Sie das wollen (was Sie natürlich nie tun, aber es ist sowieso cool).
Die Implementierung von Equals enthält eine Überschreibung von Object.Equals(Object)
, sowie eine stark typisierte Variante (die unnötige Typprüfung vermeiden kann). Die weniger typisierte Version ruft die stark typisierte Version nach einer Typprüfung auf. Die stark typisierte Version führt eine Referenzgleichheitsprüfung durch (Object.ReferenceEquals(Object,Object)
) und vergleicht dann die Werte aller Felder (nun, nur diejenigen, die Sie dem Generator mitteilen).
Was GetHashCode
, eine Smart-Faktorisierung des GetHashCode
Werte des Feldes kombiniert (unchecked
mit Überlauf Ausnahmen zu vermeiden, wenn Sie die Option checked
Compiler verwenden). Jeder der Feldwerte (abgesehen von dem ersten) wird vor der Kombination mit Primzahlen multipliziert. Sie können auch angeben, welche Felder niemals null sein würden, und es werden alle Nullprüfungen gelöscht.
Hier ist, was Sie für Ihre Polygon
Klasse erhalten, indem ALT+Insert
dann die Taste „generieren Equality Mitglieder“ Auswahl:
public class Polygon : IEquatable<Polygon>
{
public Point[] Vertices { get; set; }
public bool Equals(Polygon other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(other.Vertices, Vertices);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (Polygon)) return false;
return Equals((Polygon) obj);
}
public override int GetHashCode()
{
return (Vertices != null ? Vertices.GetHashCode() : 0);
}
}
Einige der Funktionen, die ich oben gesprochen nicht gelten, da es nur ein Feld ist . Beachten Sie auch, dass der Inhalt des Arrays nicht überprüft wurde.
Im Allgemeinen pumpt ReSharper in wenigen Sekunden eine Menge exzellenten Code aus. Und diese Eigenschaft ist ziemlich niedrig auf meiner Liste von Dingen, die ReSharper so ein erstaunliches Werkzeug macht.
Sie scheinen nicht für Equals Codegenerierung suchen werden, aber für einen generischen Algorithmus Implementierer. Ich denke du hast kein Glück hier. – erikkallen