C# 如何强制为IEquatable类的Equals方法添加新的公共属性

C# 如何强制为IEquatable类的Equals方法添加新的公共属性,c#,unit-testing,asp.net-core,iequatable,C#,Unit Testing,Asp.net Core,Iequatable,我有包含其他子类的类,所以我实现了IEquatable,以递归方式执行自定义Equals方法。这很好,但我认为如果其他开发人员需要向这些类添加新的公共属性,我们希望强制他们也将它们添加到Equals方法中。我想知道是否有一种简单的方法可以做到这一点而不需要思考?我是否可以利用自定义属性?我基本上希望将它添加到单元测试套件中,这样构建就会失败。如果您想强制以标准方式构建相等方法,也许您可以在运行时使用反射编译它们 私有静态表达式EqualityType propType、MemberExpress

我有包含其他子类的类,所以我实现了IEquatable,以递归方式执行自定义Equals方法。这很好,但我认为如果其他开发人员需要向这些类添加新的公共属性,我们希望强制他们也将它们添加到Equals方法中。我想知道是否有一种简单的方法可以做到这一点而不需要思考?我是否可以利用自定义属性?我基本上希望将它添加到单元测试套件中,这样构建就会失败。

如果您想强制以标准方式构建相等方法,也许您可以在运行时使用反射编译它们

私有静态表达式EqualityType propType、MemberExpression thisProp、MemberExpression otherProp { var equatable=typeofIEquatable.MakeGenericTypepropType; var equal=表达式.EqualthisProp,otherProp; if!equalable.IsAssignableFrompropType 回报相等; //a==b | | a!=null&&a.Equalsb 返回表达式.OrElse 相同的 安达尔索 Expression.NotEqualthisProp,Expression.Constantnull,propType, Expression.CallthisProp、equalable.GetMethodEquals、otherProp ; } 私有静态委托GenerateEquatableType类型 { var thisParm=Expression.Parametertype,a; var otherParm=Expression.Parametertype,b; 返回表达式.Lambda type.GetProperties .Whereprop=>prop.CanRead .Selectprop=>Equality prop.PropertyType, Expression.MakeMemberAccessthisParm,prop, Expression.MakeMemberAccessotherParm,prop .Aggregatea,b=>Expression.AndAlsoa,b, thisParm,otherParm.Compile; } 公共静态函数GenerateEquatable,其中T:IEquatable=> FuncGenerateEquatabletypeofT; 公共类Foo:IEquatable{ 私有静态函数_=GenerateEquatable; public bool等于[AllowNull]Foo other=>other!=null&&u equalthis,other; }
除了编写你自己的分析器(充其量也不确定)之外,没有。我的建议是,在你的代码中添加一个非常离谱的大注释,然后编写单元测试使用静态构造函数生成一个equals Func方法?@MichaelRandall是的,我考虑过这种性质的注释,但它实际上没有强制执行任何内容。另外,我的团队通常尽可能避免评论。但是谢谢你的回复@杰里米·凯曼——嗯,这是一个有趣的答案。我还不知道那会是什么样子,但它为调查开辟了一条道路——谢谢!如果你有时间,你能把这个想法再扩展一点吗?@MichaelRandall-Hahah-是的,我完全理解!这并不是说我们不写评论,我们的公共方法上肯定有xml文档,或者更复杂的逻辑,更重要的是,只有在适当的命名和清晰的代码仍然无法传达信息的情况下才使用它们。但在这种情况下,这可能是一条出路