escribí algunas cosas un poco de tiempo atrás que pueda resolver su problema ... (Y, de hecho, es probable que podría mejorarse para incluir la semilla que usted tiene ...)
De todos modos, el proyecto es llamado Esencia (http://essence.codeplex.com/), y utiliza las bibliotecas para generar System.Linq.Expression (basado en atributos) representaciones estándar de iguales/GetHashCode/CompareTo/ToString, además de ser capaz de crear clases IEqualityComparer y IComparer basado en una lista de argumentos . (También tengo algunas ideas adicionales, pero me gustaría obtener algunos comentarios de la comunidad antes de continuar mucho más).
(Lo que esto significa es que es casi tan rápido como estar escrito a mano, el principal donde no lo es la CompareTo(); causar los Linq.Expressions no tiene el concepto de una variable en la liberación 3.5 - lo que tiene que llamar CompareTo() en el objeto que subyace dos veces cuando usted no recibe un partido Uso de las extensiones de DLR. a Linq.Expressions resuelve esto. Supongo que podría haber usado el emit il, pero no estaba tan inspirado en ese momento.)
Es una idea bastante simple, pero no lo había visto antes.
Ahora, el tema es que perdí interés en pulirlo (lo que hubiera incluido escribir un artículo para codeproject, documentar parte del código, etc.), pero podría persuadirse para que lo haga si se siente sería algo de interés.
(El sitio codeplex no tiene un paquete descargable, solo ve a la fuente y toma eso - oh, está escrito en f # (aunque todo el código de prueba está en C#) ya que eso era lo que a mí me interesaba . aprendizaje)
de todos modos, aquí está son C# ejemplo de la prueba en el proyecto:
// --------------------------------------------------------------------
// USING THE ESSENCE LIBRARY:
// --------------------------------------------------------------------
[EssenceClass(UseIn = EssenceFunctions.All)]
public class TestEssence : IEquatable<TestEssence>, IComparable<TestEssence>
{
[Essence(Order=0] public int MyInt { get; set; }
[Essence(Order=1] public string MyString { get; set; }
[Essence(Order=2] public DateTime MyDateTime { get; set; }
public override int GetHashCode() { return Essence<TestEssence>.GetHashCodeStatic(this); }
...
}
// --------------------------------------------------------------------
// EQUIVALENT HAND WRITTEN CODE:
// --------------------------------------------------------------------
public class TestManual
{
public int MyInt;
public string MyString;
public DateTime MyDateTime;
public override int GetHashCode()
{
var x = MyInt.GetHashCode();
x *= Essence<TestEssence>.HashCodeMultiplier;
x ^= (MyString == null) ? 0 : MyString.GetHashCode();
x *= Essence<TestEssence>.HashCodeMultiplier;
x ^= MyDateTime.GetHashCode();
return x;
}
...
}
de todos modos, el proyecto, si alguien piensa que vale la pena, es necesario pulir, pero las ideas están ahí ...
El código se ve bien. Como mejora, puede verificar si los campos [i] no son nulos. –
Solo una adición: no se recomienda agregar métodos de extensión al tipo de objeto. –
Lo sé, pero ¿por qué? En realidad, no hemos cambiado la funcionalidad del objeto de ninguna manera. Tu sentido de la inteligencia solo estará desordenado. Y tampoco hay necesidad de hacer de esto un método de extensión, simplemente lo hace más conveniente. Todavía podría llamar al método estático que pasa en el objeto. –