Методы расширения на общих классах

Я играю вокруг с созданием некоторых беглых 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
    }
}

1 ответ

Решение

В обоих ваших методах расширения просто отсутствуют дополнительные общие аргументы, которые необходимы:

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);
    }
}
Другие вопросы по тегам