[英]C# Generics - Determine generic type from consuming generic method
长话短说:我正在开发一个具有Tasks
和Handlers
。 任务将从系统的不同部分发送到Handler,最终它们将返回一个值。
我们已经有了一个松散类型的系统,并且变成了一个混乱的混乱局面(由于任务启动器通常来自本质上是插件的第三方组件,因此该问题被大大放大了。 ins)。
我一直在思考的方式来实现一个强类型的方式是相同的-并且可能只是考虑这obsurdity点-但我接近想什么我。 问题是某些语法。
这就是我所得到的(通用名称为了清楚起见进行了扩展):
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>();
}
}
...如果是的话,当SpecificTask
包含该类型时,我该如何声明PerformTask
的返回类型?
不幸的是,您无法做您想做的事情并保留静态类型检查。 必须将所有通用类型参数都声明为delar,以便编译器能够静态地知道行进路线。
您可以通过反思来做到这一点,但首先会完全破坏泛型的目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.