私はいくつかの流暢な 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>();
最後の 2 行はコンパイルされず、不明なメソッドのエラーが発生します。可能であれば、拡張メソッドを使用してそれを達成する必要があると思いますが、実用的な解決策を思いつくことができませんでした。これが私がこれまでに持っているものです...
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
}
}