2

这是我的示例界面:

public interface IJob<T, R>
    where T : IStep
    where R : IDelivery
{
    T Step { get; set; }
    R Delivery { get; set; }
}

这是我的示例实现

public class ImageJob<T, R> : IJob<T, R>
    where T : ImageStep
    where R : ImageDelivery
{
    public T Step { get; set; }
    public R Delivery { get; set; }
}

ImageStep和ImageDelivery实现了各自的接口(IStep、IDelivery)

现在我要做的是接口我所有的存储库方法。我们以这个方法为例:

public void CreateJob(IJob<IStep, IDelivery> job);

所以我创建了一个新的:

var job = new ImageJob<ImageStep, ImageDelivery>
{
    ...
}

然后我尝试将其传递给存储库方法:

repository.CreateJob(job);

我收到一条错误消息:

Unable to cast ImageJob<ImageStep, ImageDeliver> to type IJob<IStep, Idelivery>

有人可以向我解释为什么这会引发错误吗?我实施和连接完全错误吗?

我正在尝试做的事情有一个优雅的解决方案吗?

我想用不同的StepDelivery方法等抽象出每个Job。这可能是其他方式吗?还是我完全错过了什么?

4

2 回答 2

4

我认为可以使用协方差。这使您能够将特定的泛型类型转换为其泛型接口或基类之一,例如:

MyType<object> list = new MyType<MyType>;

类和接口声明:

public interface IMyType<out T>{...}
public class MyType<T> : IMyType<T> {...}

Generic decleration 中的“out”关键字启用强制转换。

是 MSDN 上的一个不错的页面,可以进一步帮助您

在您的情况下,它会是(如果您没有在界面中使用设置器

public interface IJob<out T, out R>
    where T : IStep
    where R : IDelivery
{
    T Step { get; }
    R Delivery { get; }
}

这应该适用于您实现的类

于 2012-10-12T19:14:05.563 回答
2

我认为IJob需要声明

public interface IJob<T, R>
    where T : IStep
    where R : IDelivery
{
    T Step { get; set; }
    R Delivery { get; set; }
}

否则,TandR参数永远不会在接口中使用,并且IJob实际上是非泛型的。除此之外,为清楚起见,您可能需要命名类型参数TStepTDelivery.

于 2012-10-12T19:11:42.513 回答