不久前我写了一些东西,你可能会解决你的问题......(实际上,它可能会被改进以包含你拥有的种子......)
无论如何,该项目称为 Essence ( http://essence.codeplex.com/ ),它使用 System.Linq.Expression 库来生成(基于属性)Equals/GetHashCode/CompareTo/ToString 的标准表示,以及因为能够基于参数列表创建 IEqualityComparer 和 IComparer 类。(我也有一些进一步的想法,但想在继续深入之前获得一些社区反馈。)
(这意味着它几乎和手写一样快 - 不是的主要是 CompareTo(); 因为 Linq.Expressions 在 3.5 版本中没有变量的概念 - 所以你有当你没有得到匹配时,在底层对象上调用 CompareTo() 两次。使用 Linq.Expressions 的 DLR 扩展解决了这个问题。我想我可以使用 emit il,但当时我并没有那么灵感.)
这是一个非常简单的想法,但我以前从未见过它。
现在的问题是,我对完善它失去了兴趣(这将包括为 codeproject 写一篇文章,记录一些代码等),但如果你觉得这会是什么,我可能会被说服这样做出于兴趣。
(codeplex 站点没有可下载的包;只需转到源代码并获取它 - 哦,它是用 f# 编写的(尽管所有测试代码都在 c# 中),因为这是我有兴趣学习的东西。)
无论如何,这是项目中测试的 c# 示例:
// --------------------------------------------------------------------
// 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;
}
...
}
无论如何,这个项目,如果有人认为值得,需要打磨,但想法是存在的......