有没有办法从 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 MemberInfo
、PropertyInfo
或 FieldInfo
)。你可以通过使用这样一个相当丑陋的结构来解决这个问题:
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] 属性的属性?的主要内容,如果未能解决你的问题,请参考以下文章