2

私はいくつかの流暢な 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
    }
}
4

1 に答える 1

3

どちらの拡張メソッドにも、必要な追加のジェネリック引数が不足しています。

public static class RunExtensions
{
    public static TRun Run<TRun, TActor, TTarget>(this TRun map) 
        where TRun : Run<TActor, TTarget>
    {
        return map;
    }

    public static Run<TActor, TTarget> Run<TActor, TTarget>(this TActor actor)
    {
        return new Run<TActor, TTarget>(actor);
    }
}
于 2013-02-25T21:58:29.380 に答える