我正在编写一个流利的api,用于构建业务数据概念以设置集成和回归测试。
我有以下内容:
public AndWithContext<T> AndWith(Action<T> withAction)
{
withAction(_instance);
return new AndWithContext<T>(_instance);
}
public AndWithContext<TOut> AndWith<TOut>(Func<T, TOut> withContextChangeFunc)
{
var output = withFunc(_instance);
return new AndWithContext<TOut>(output);
}
以及一个示例,说明我如何想使用api的Action<T>
部分:
workOrder = c.Given<WorkOrder>()
.With(wo => wo.ReferenceNbr = 1234)
.AndWith(wo => wo.SpecOrder = specOrder)
.AndWith(wo => wo.WorkItems = workItems)
.Create();
我希望对.AndWith(wo => wo.SpecOrder = specOrder)
的调用会分派到AndWith(Action<T>)
,但它正在AndWith<TOut>(Func<T, TOut>)
上登陆
是的,我知道我可以通过在上下文内分配属性值时告诉用户使用以下约定来使其按需工作:
workOrder = c.Given<WorkOrder>()
.With(wo => wo.ReferenceNbr = 1234)
.AndWith(wo => {
wo.SpecOrder = specOrder;
wo.WorkItems = workItems;
return wo;
})
.Create();
但这不是重点。
对我来说,有趣的是(wo => {wo.SpecOrder = specOrder;})
路由到正确的重载,但是突然删除括号和分号会使它的行为类似于Func<T, TOut>
。
我确定我的WithContext
签名也正在发生这种情况,但是对我的with上下文的调用都是上下文转移调用,并且纯粹是出于可读性和语句的开头,所以我有点不在乎关于那些。