簡體   English   中英

具有泛型類型問題的泛型方法

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM