2009-09-28 192 views
0

长篇小说:我正在研究一个系统,该系统将有TasksHandlers。任务将从系统的不同部分发送到处理程序,最终返回值。C#泛型 - 从使用泛型方法确定泛型

我们已经得到了一个松散类型的系统,并且变成了粗糙混乱的东西(问题由于任务发起者经常来自第三方组件基本上是插件)。

我一直在想办法以强类型的方式实现它 - 可能只是将它带到了模糊的地步 - 但我接近就像。问题是一些语法。

这里是我有(为清楚起见扩大通用名称):

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已经提供了它的返回类型为泛型参数,可以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>(); 
    } 
} 

......如果是这样,我怎么会声明在类型包含在SpecificTaskPerformTask返回类型?

回答

0

不幸的是,你不能做你想做的事情,并保留静态类型检查。为了使编译器能够静态地知道在哪里发生了什么,所有的泛型类型参数都必须被延迟。

你可以用反射来做到这一点,但这首先会完全破坏泛型的目的。

+0

害怕可能是这种情况...希望它可能只是一些我不知道的语法 – STW 2009-09-28 20:12:40