繁体   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