C#泛型 - 通过使用泛型方法确定泛型类型

时间:2009-09-28 20:09:22

标签: c# .net generics

长篇故事:我正在开发一个拥有TasksHandlers的系统。任务将从系统的不同部分发送到处理程序,最终它们将返回一个值。

我们有一个松散类型的系统,并且变成了一个混乱的东西(问题因为任务启动器通常来自第三方组件而显着放大了基本上是插件)。

我一直在想办法以强烈的方式实现同​​样的方式 - 而且可能只是把它带到了阴暗的地步 - 但接近于我喜欢的。问题是一些语法。

这就是我所拥有的(为了清晰起见,扩展了通用名称):

interface ITask<ReturnType> { }

interface ITaskHandler<TaskType, TaskReturnType> where TaskType : ITask<TaskReturnType>
{
    TaskReturnType PerformTask(TaskType task);
}

如您所见,ITask是通用的,ITask的声明通用参数是ITaskHandler<ITask>的返回类型。这意味着每个TaskHandler都以合约方式绑定,以返回其ITask指定的类型。

声明TaskHandlers的一大缺点导致一些相当难看的签名......

class SpecificTask : ITask<Dictionary<Type,Delegate>>
{
}

class SpecificHandler : ITaskHandler<SpecificTask, Dictionary<Type, Delegate>>
{
    public Dictionary<Type, Delegate> PerformTask(SpecificTask task)
    {
        return new Dictionary<Type, Delegate>();
    }
}

我的问题是:由于SpecificTask已将其ReturnType作为通用参数提供,因此SpecificHandler的签名可缩短为更接近的内容:

interface ITaskHandler<TaskType> where TaskType : ITask
{
    // pulling TaskReturnType out of thin air...
    TaskReturnType PerformTask(TaskType task);
}

class SpecificHandler : ITaskHandler<SpecificTask>
{
    public Dictionary<Type, Delegate> PerformTask(SpecificTask task)
    {
        return new Dictionary<Type, Delegate>();
    }
}

...如果是这样,当PerformTask中包含类型时,如何声明SpecificTask的返回类型?

1 个答案:

答案 0 :(得分:0)

不幸的是,您无法执行您想要执行的操作并保留静态类型检查。必须延迟所有泛型类型参数,以便编译器能够静态地知道其中的位置。

你可以用反射做到这一点,但这首先会完全破坏仿制药的目的。