包含带有谓词的属性时的异常

Posted

技术标签:

【中文标题】包含带有谓词的属性时的异常【英文标题】:Exception when including properties with predicate 【发布时间】:2019-12-06 07:04:47 【问题描述】:

我正在尝试比较具有多个属性的两个对象,但需要使用谓词比较特定属性(object1object2 处没有这些属性的确切值,因此我需要在此处比较部分字符串)。

所以,我正在尝试:

object1.Should().BeEquivalentTo(object2, options => options
    .Including(o => o.Property1.StartsWith("something"))
    .Including(o => o.Property2.StartsWith("something else")
);

我希望像往常一样比较所有其他属性。

但是,运行上面的代码会抛出异常:

消息:System.ArgumentException:表达式<Convert(o.Property1.StartsWith("something"), Object)> 不能用于选择成员。 参数名称:表达式

我检查了文档,它与我的示例相同(https://fluentassertions.com/objectgraphs/ 上的“选择成员”一章)。

为什么会出现这个异常,我该如何解决?

【问题讨论】:

@Nkosi “更好的例子”是什么意思?我有两个具有一组字符串属性的相同类型的对象。我想断言这些对象是相等的,但是对于某些特定属性,断言应该基于谓词 (.StartsWith())。 断言object1.Property1.StartsWith("https://www.google.com") 等于object2.Property1 = "https://www.google.com/search?q=test" 【参考方案1】:

为什么会出现这个异常

异常发生是因为你调用了一个函数

.Including(o => o.Property1.StartsWith("something")) //<-- expects property only

在只期望获得属性表达式的表达式中。

.Including(o => o.Property1) //<-- expects property only

参考原始问题中链接的相同文档,您的示例在进行比较时将仅包含指定的成员。

根据您的尝试,您应该查看 Equivalency Comparison Behavior 部分,该部分基于您的 cmets,可能类似于以下示例

[TestClass]
public class ObjectEquivalencyTests 
    [TestMethod]
    public void ShouldBeEquivalent() 

        var expected = new MyObject 
            Property1 = "https://www.google.com",
            Property2 = "something else"
        ;

        var actual = new MyObject 
            Property1 = "https://www.google.com/search?q=test",
            Property2 = "something else"
        ;

        actual.Should().BeEquivalentTo(expected, options => options
            .Using<string>(ctx => ctx.Subject.Should().StartWith(ctx.Expectation))
            .When(info => info.SelectedMemberPath == "Property1")
        );
    


public class MyObject 
    public string Property1  get; set; 
    public string Property2  get; set; 

【讨论】:

以上是关于包含带有谓词的属性时的异常的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController 我在数组中使用带有属性的谓词?

带有 NSdate 谓词的 NSFetchrequest

带有函数参数的 CoreData 谓词

如何使用属性作为 FetchRequest 谓词的参数

谓词构建器组和/或带有内部外部的查询

核心数据获取谓词“不包含”?