2

NBuilder有以下两种 fluent 方法

.Has(..)
.Have(..)

例如。

return Builder<User>.CreateListOfSize(100)
    .WhereTheFirst(1)
        .Has(x => x.FirstName = "Jon Skeet")
    .Build();

return Builder<User>.CreateListOfSize(100)
    .WhereTheFirst(1)
        .Have(x => x.FirstName = "Jon Skeet")
    .Build();

我不明白有什么区别?有人可以解释一下为什么我会做一个 Have 而不是 Has .. 反之亦然?

4

2 回答 2

2

它们是相同的。完整的源代码在这里

拥有:

    [Obsolete(Messages.NewSyntax_UseWith)]
    public static IOperable<T> Has<T, TFunc>(this IOperable<T> operable, Func<T, TFunc> func)
    {
        return With(operable, func);
    }

有:

    [Obsolete(Messages.NewSyntax_UseWith)]
    public static IOperable<T> Have<T, TFunc>(this IOperable<T> operable, Func<T, TFunc> func)
    {
        return With(operable, func);
    }
于 2011-03-16T00:45:21.947 回答
1

存在Has并且Have是在两种不同的用途中提供流利的语法的原因。

例如,Has在这种情况下有意义:

Builder<User>.CreateListOfSize(100)
    .WhereTheFirst(1)
        .Has(x => x.FirstName = "Jon Skeet")
    .Build();

虽然,Have在这种情况下是有意义的:

Builder<User>.CreateListOfSize(100)
    .WhereAll()
        .Have(x => x.FirstName = "Jon Skeet")
    .Build();

然而,最近,人们认识到需要清理语法以防止由于创建列表与单个对象时的语法差异而造成混淆。

所以现在您可以执行以下操作:

Builder<User>.CreateListOfSize(100)
    .All()
        .With(x => x.FirstName = "Jon")
    .TheFirst(1)
        .With(x => x.LastName = "Skeet")
    .Build();

...希望这应该不会那么令人困惑。

此外,您会在 ClosureCowboy 给出的答案中注意到,当他回答时, HasandHave扩展已经被标记为过时......

于 2011-12-08T06:34:59.793 回答