有没有办法从 FluentAssertions 中的 .BeEquivalentTo(..) 中排除标有 [Obsolete] 属性的属性?

Posted

技术标签:

【中文标题】有没有办法从 FluentAssertions 中的 .BeEquivalentTo(..) 中排除标有 [Obsolete] 属性的属性?【英文标题】:Is there a way to exclude Properties marked with [Obsolete] Attribute from .BeEquivalentTo(..) in FluentAssertions? 【发布时间】:2021-09-12 12:56:51 【问题描述】:

我通过使用 FluentAssertions 中的 .Should().BeEquivalentTo(..) 检查实例自定义克隆的等效性。 现在有一些属性被标记为过时并且不再被克隆。有没有办法排除这些属性?

我试图获取属性的属性但失败了。

.Excluding(b => b.SelectedMemberInfo.MemberType.GetCustomAttributesData()
                  .Any(ca => ca.AttributeType == typeof(ObsoleteAttribute)))

【问题讨论】:

【参考方案1】:

问题在于 MemberType 为您提供了由字段或属性公开的对象类型,而不是属性或字段本身(.NET MemberInfoPropertyInfoFieldInfo)。你可以通过使用这样一个相当丑陋的结构来解决这个问题:

Excluding(b => b.SelectedMemberInfo.DeclaringType.GetMember(b.Name).SingleOrDefault()?.GetCustomAttributes().Any(ca => ca.AttributeType == typeof(ObsoleteAttribute))

【讨论】:

我开始使用.Excluding(a => a.DeclaringType.GetMember(a.Name).SingleOrDefault().GetCustomAttributesData().Any(ca => ca.AttributeType == typeof(ObsoleteAttribute))),它在一开始就偏离了一个SelectedMemberInfo。我猜是因为a 已经是SelectedMemberInfo 了?

以上是关于有没有办法从 FluentAssertions 中的 .BeEquivalentTo(..) 中排除标有 [Obsolete] 属性的属性?的主要内容,如果未能解决你的问题,请参考以下文章

FluentAssertions 基于反射的相等

FluentAssertions 没有例外? [复制]

FluentAssertions - 比较包含名称相似但类型不同的属性的对象

FluentAssertions:排序列表的等价性

C# fluent 断言检查结果为 bool

流利的断言:大约比较两个数字集合