我正在构建一个支持基于通用类型数据的插件的应用程序。问题是,我似乎无法指定允许我需要通过的所有内容的通用条件,这是代码的详细信息:
abstract public class PluginObject<ManagedType>
abstract public class Plugin<EditedType> where EditedType : PluginObject<Object>
这<Object>
就是问题所在,当我创建我的类和插件时,我将创建模型来处理插件的数据方面。为此,我的第一个插件有很多项目要管理,我无法真正创建所有项目的子类,所以我最终创建了一个IOrderObject
不包含任何内容的接口。
因此,我最终得到:
SynchronizableObject
TripRoute
TripRouteDirection
ITripObject
(接口在#2 和#3 中实现)
这样我可以做到:
public class RoutePluginObject<ManagedType> : Activis.Framework.Admin.PluginObject<ManagedType>
public class RouteManagementPlugin : Activis.Framework.Admin.Plugin<RoutePluginObject<Transdev.Limocar.iTripObject>>
它被接受了,但问题是它ITripObject
是一个接口而不是一个对象,所以它可以转换为PluginObject<Object>
.
所以我的问题是,有没有办法指定一个允许类似这样的条件:
abstract public class Plugin<EditedType> where EditedType : PluginObject<Any>
这样,接口或对象可以由我并不真正关心这种情况提供;我想要的只是我Plugin
的 'seditedtype
是PluginObject
任何可能的。
编辑
具有更好的协方差结果但仍然出现错误,我在您的示例(Matias)中没有看到任何关于 PluginObject 继承的信息,这就是我所做的:
public interface IPluginObject<out ManagedType>
abstract public class Plugin<EditedType> where EditedType : IPluginObject<EditedType>
public class RoutePluginObject : Activis.Framework.Admin.IPluginObject<TripRoute>
public class RouteManagementPlugin : Activis.Framework.Admin.Plugin<RoutePluginObject>
但是我仍然在 RouteManagementPlugin 上遇到错误:
类型“Transdev.Limocar.Admin.RoutePluginObject”不能用作泛型类型或方法“Activis.Framework.Admin.Plugin”中的类型参数“EditedType”。没有从“Transdev.Limocar.Admin.RoutePluginObject”到“Activis.Framework.Admin.IPluginObject”的隐式引用转换
除非我误解了协方差(可能是这种情况),否则我似乎清楚地遵循了您的示例,但仍然无法正常工作...