[英]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.