Я играю с созданием каких-то беглых 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, как показано ниже, но потом я бегу в проблемы с этим сейчас, зная, что осязательный рецептор или 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
}
}
«не компилируется» менее полезна, чем фактическое сообщение об ошибке, предоставленной компилятором. –
Очень верно. Извини за это. Ошибка - неизвестный параметр (в зависимости от того, что там не существует). –