我有一个带有此方法签名的工厂类
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>
等Type1
和Type2
将继承自{ {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
答案 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
。