2009-09-28 104 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