[英]Generic method with generic type problem
我对通用方法的约束有疑问。 这是所有类的代码:
namespace Sdk.BusinessObjects
{
public interface IBusinessObject
{
}
}
namespace Sdk.BusinessObjects
{
[DataContract]
public class AccountDetails : IBusinessObject
{
[DataMember]
public virtual Guid AccountId { get; set; }
// More properties...
}
}
namespace Sdk.BusinessLogic
{
public interface IManager<T> where T : IBusinessObject
{
T Add(T businessObject);
void Delete(T businessObject);
IList<T> ListAll();
}
}
namespace Sdk.BusinessLogic
{
public interface IAccountManager : IManager<AccountDetails>
{
void ChangeAccountState(Guid accountId, string state);
}
}
namespace Sdk.BusinessLogic
{
public interface IManagerFactory
{
T Create<T>() where T : IManager<IBusinessObject>;
}
public class ManagerFactory : IManagerFactory
{
public T Create<T>() where T : IManager<IBusinessObject>
{
// resolve with Unity and return
}
}
}
因此,我具有所有业务对象(例如AccountDetails)的主要IBusinessObject接口,以及IManager作为业务对象的通用管理器接口。 我想为有限制的这些经理创建工厂。 当我在UnitTest中尝试这样的事情时:
IManagerFactory factory = new ManagerFactory();
factory.Create<IAccountManager>();
我收到错误消息:类型'Sdk.BusinessLogic.IAccountManager'不能用作通用类型或方法'Sdk.BusinessLogic.IManagerFactory.Create()'中的类型参数'T'。 没有从“ Sdk.BusinessLogic.IAccountManager”到“ Sdk.BusinessLogic.IManager”的隐式引用转换。
如何才能做到这一点?
基本上,您的问题是IManager<T>
是不变的,并且必须是因为您有从API出来的值和进入其中的值。 因此, IAccountManager
不是 IManager<IBusinessObject>
,因为否则您可以编写:
IAccountManager m1 = new SomeImplementation();
IManager<IBusinessObject> m2 = m1;
m2.Add(new SomeArbitraryBusinessObject());
客户经理仅用于管理帐户 ,而不仅仅是任何业务对象。
一种选择是对ManagerFactory.Create
使用两个通用类型参数,而不是一个:
public TManager Create<TManager,TObjectType>()
where TManager : IManager<TObjectType>
where TObjectType : IBusinessObject
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.