0

我正在构建一个支持基于通用类型数据的插件的应用程序。问题是,我似乎无法指定允许我需要通过的所有内容的通用条件,这是代码的详细信息:

abstract public class PluginObject<ManagedType>
abstract public class Plugin<EditedType> where EditedType : PluginObject<Object>

<Object>就是问题所在,当我创建我的类和插件时,我将创建模型来处理插件的数据方面。为此,我的第一个插件有很多项目要管理,我无法真正创建所有项目的子类,所以我最终创建了一个IOrderObject不包含任何内容的接口。

因此,我最终得到:

  1. SynchronizableObject
  2. TripRoute
  3. TripRouteDirection
  4. 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的 'seditedtypePluginObject任何可能的。


编辑

具有更好的协方​​差结果但仍然出现错误,我在您的示例(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”的隐式引用转换

除非我误解了协方差(可能是这种情况),否则我似乎清楚地遵循了您的示例,但仍然无法正常工作...

4

2 回答 2

3

您只需要第二个通用参数:

abstract public class PluginObject<ManagedType> {}
abstract public class Plugin<EditedType, OtherType> where EditedType : PluginObject<OtherType>
于 2012-11-01T19:52:49.863 回答
1

你需要协方差

也就是说,泛型参数可以向下转换

协变和逆变只能用于接口委托泛型参数。

在您的情况下,您应该PluginObject作为接口实现:

public interface IPluginObject<out T>

这将使您的代码能够这样做:

public abstract class Plugin<TEdited> where TEdited : IPluginObject<TEdited>

归根结底,假设您有一个类型Person和一个派生类型EmployeePerson实现IPluginObject<out T>。然后,由于协方差,下一个代码是有效的:

IPluginObject<object> myPluginObject = new Employee();

最后,当然,您可以这样做:

public class MyPlugin : Plugin<Employee>
{
}

这是你要找的吗?

查看此 MSDN 文章以获取有关此主题的更多详细信息:http: //msdn.microsoft.com/en-us/library/dd799517.aspx

于 2012-11-01T20:20:40.120 回答