我正在设计一个与Linq非常相似的API(它是一个对更复杂的对象起作用的linq),而且我有一些客户端开发人员并不完全了解它背后的理念。我想阻止他们做一些事情,以便他们的代码更符合API的全部内容。因此,对于示例,我将仅提及Linq。
非常简短,我在客户端代码中看到的内容类似于:
IEnumerable<double> xlist;
IEnumerable<double> ylist;
var zlist = xlist.Select( (x,i) => x + ylist.ElementAt(i) );
这真的很糟糕,而不是我必须告诉别人他们行为不端,我想强迫我的客户写这个:
var zlist = xlist.Zip(ylist, (x,y) => x + y);
因此在考虑之后,我认为我真正想要的API是阻止客户将数据“注入”委托类型。换句话说,我想定义扩展方法,例如:
IEnumerable<TResult> MySelect<TSource, TResult>(
this IEnumerable<TSource> source,
StaticFunc<TSource, int, TResult> selector)
其中StaticFunc是某种不包含任何数据的委托类型(或者最多只包含静态上下文数据)。
有人能看到这样做吗?
答案 0 :(得分:3)
我正在设计一个与Linq非常相似的API(它是一个对更复杂的对象起作用的linq),而且我有一些客户端开发人员并不完全了解它背后的理念。我想阻止他们做一些事情,以便他们的代码更符合API的所有内容。
听起来你真正需要的是代码审查和教育,而不是工具。在语言中肯定没有什么可以确保开发人员不这样做 - 你甚至都不想,IMO。例如,您的规则将禁止:
public IQueryable<Person> FindUsersByFirstName(string firstName)
{
return repository.Users.Where(user => user.FirstName == firstName);
}
毕竟,firstName
是上下文数据......但这与LINQ完全一致。
答案 1 :(得分:0)
您可以尝试使用Expression Trees代替委托。与代理人的情况不同,您将能够检查传递给代码的内容。