我正在尝试创建一些流畅的 API;一种DSL。我一直遇到一个特定的问题,我还没有找到解决它的方法,在这里或其他地方,可以解决我所看到的确切问题。此外,我看到很多人问这个问题的许多变化。
这是我想做的一个明显做作的示例...
Run<Car>.Off<Road>();
Run<Car>.Off<Cliff>();
Run<Person>.Off<Road>();
Person pete = new Person();
pete.Run().Off<Road>();
pete.Run().Off<Cliff>();
最后两行将无法编译,给出未知方法的错误。我想我需要使用扩展方法来完成它,如果它甚至可能的话,但我一直无法想出一个可行的解决方案。这是我到目前为止...
public class Run<TActor, TTarget>
{
public Run() { }
public Run(TActor actor) { }
public Run(TActor actor, TTarget target) { }
public TActor Actor { get; set; }
public TTarget Target { get; set; }
}
public static class Run<TActor>
{
public static Run<TActor, TTarget> Off<TTarget>()
{
return new Run<TActor, TTarget>();
}
}
我尝试在 Run 上制作扩展方法,如下所示,但后来我遇到了问题,现在知道什么是 TActor 或 TTArget 类型。
public static class RunExtensions
{
public static TRun Run<TRun>(this TRun run) where TRun : Run<TActor, TTarget>
{
// doesn't compile
}
public static Run<TActor, TTarget> Run<TActor>(this TActor actor)
{
// obviously this doesn't work either
}
}