c# - 泛型类的扩展方法

标签 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>();

最后两行将无法编译,并给出未知方法错误。我认为我需要使用扩展方法来完成它,如果可能的话,但我一直无法想出一个可行的解决方案。这是我到目前为止所拥有的...

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
    }
}

最佳答案

您的两种扩展方法都缺少所需的其他通用参数:

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);
    }
}

关于c# - 泛型类的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15077195/

相关文章:

C# - 当前上下文中不存在该名称

c# - 通用类型传递和用法,我可以执行以下操作吗?

java - 如何仅使用 Java 7(及以下版本)将原始数据类型列表转换为 List<String>

c# - 实现多个通用接口(interface) - 类型错误

c# - 带有 String.Format 奇怪编译器错误的扩展方法

C# - 进行更快的 MySql 查询?

c# - DispatcherTimer 等待循环

c# - 如何使用 C#/.NET 的反射在程序集中实例化类?

c# - 内部类中接口(interface)的扩展方法

c# - 使用属性扩展字符串类?