通用类的扩展方法

时间:2013-02-25 21:51:32

标签: c# generics extension-methods fluent

我正在玩创建一些流畅的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>();

最后两行不会编译,给出错误的Unknown Method。我认为我需要使用扩展方法来实现它,如果它甚至可能,但我无法提出一个有效的解决方案。这是我到目前为止所拥有的......

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 个答案:

答案 0 :(得分: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);
    }
}