从工厂类返回派生类型

时间:2014-01-19 22:15:00

标签: c# interface entity-framework-5 factory-pattern

我有一个带有此方法签名的工厂类

 public static PortfolioUnitOfWork<IPortfolio> GetPortfolioUnitOfWork(string supplier)
 {
 }

PortfolioUnitOfWork是一个通用对象,可以采用不同的投资组合类型。

public class PortfolioUnitOfWork<T> :Abstracts.UnitOfWork<T> where T:class, Data.Interfaces.IPortfolio
{
}

这里的想法是将字符串传递到工厂,从该字符串返回PortfolioUnitOfWork<Type1>PortfolioUnitOfWork<Type2>Type1Type2将继承自{ {1}}。

尝试为此工厂类方法设置返回项时,出现错误

IPortfolio

IPortfolio接口没有方法,只有很多属性

cannot convert expression type PortfolioUnitOfWork<Type1> to return type PortfolioUnitOfWork<IPortfolio>

投资组合类型是EntityFramework实体,但我有一个部分类,其中实体从接口继承。由此,它们还具有一些非映射属性。

我原本以为使用public interface IPortfolio { int Id { get; set; } string Name { get; set; } .... } 作为返回类型将允许工厂类根据需要返回正确的PortfolioUnitOfWork。任何可能出现错误的想法?

//修改

奇怪的是,如果我将返回类型设置为

,则在Factory类中
PortfolioUnitOfWork<IPortfolio>

IDE中没有立即出现错误(虽然没有进行构建)。我认为这将是无效的,因为return new PortfolioUnitOfWork<IPortfolio>() 类继承自T

这也不起作用,同样的错误。

PortfolioUnitOfWork

像这样的东西可以工作,显示PortfolioUnitOfWork<IPortfolio> porfolio = new PortfolioUnitOfWork<Type1>(); 实现了正确的接口

Type1

1 个答案:

答案 0 :(得分:1)

这是因为c#中的泛型类型默认为invariant。这意味着您无法执行以下操作:

List<object> list = new List<string>();

或在你的情况下

PortfolioUnitOfWork<IPortfolio> porfolio = new PortfolioUnitOfWork<Type1>();

并且你不能做它们的变体,因为在.NET中只有接口和委托类型参数可以是变体。尝试时会出现以下错误:

  

无效的方差修饰符。只能将接口和委托类型参数指定为变体。

可能的方式去?创建IPortfolioUnitOfWork

public interface IPortfolioUnitOfWork
{ }

并更改您的PortfolioUnitOfWork<T>以实现:

public class PortfolioUnitOfWork<T> : IPortfolioUnitOfWork where T: class, IPortfolio

现在您可以执行以下操作:

IPortfolioUnitOfWork porfolio = new PortfolioUnitOfWork<Type1>();

ofc,您必须将退货声明和变量类型从PortfolioUnitOfWork<IPortfolio>更改为IPortfolioUnitOfWork