【问题标题】:Multilevel generic repository with generic interface具有通用接口的多级通用存储库
【发布时间】:2014-04-29 17:28:06
【问题描述】:

我在实现存储库逻辑时遇到问题。在一个真实的项目中我使用了 Ninject,所以我对一些类使用了接口。现在我对这个问题做了一个非常简单的演示:

// ------- Base User -------------- //

public interface IBaseUser
{
    int Id { get; set; }
}
public class BaseUser : IBaseUser
{
    public int Id { get; set; }
}

// -------- Individual User --------//

public interface IIndividualUser : IBaseUser
{
    string Gender { get; set; }
}
public class IndividualUser: BaseUser, IIndividualUser
{
    public string Gender { get; set; }
}

// -------- Legal User --------//

public interface ILegalUser : IBaseUser
{
    string VatNumber { get; set; }
}
public class LegalUser : BaseUser, ILegalUser
{
    public string VatNumber { get; set; }
}

// -------- Base User Repo --------//

public interface IBaseUserRepo<T> where T: BaseUser
{
    T GetById(int id);
}
public class BaseUserRepo<T> where T : BaseUser, IBaseUserRepo<T>
{
    public T GetById(int id)
    {
        // logic...
    }
}

// -------- Individual User Repo --------//

public interface IIndividualUserRepo : IBaseUserRepo<IndividualUser>
{
    IndividualUser GetByGender(string gender);
}
public class IndividualUserRepo : BaseUserRepo<IndividualUser>, IIndividualUserRepo
{
    public IndividualUser GetByGender(string gender)
    {
        // logic...
    }
}

// -------- Legal User Repo --------//

public interface ILegalUserRepo : IBaseUserRepo<LegalUser>
{
    LegalUser GetByVatNumber(string vatNumber);
}
public class LegalUserRepo : BaseUserRepo<LegalUser>, ILegalUserRepo
{
    public LegalUser GetByVatNumber(string vatNumber)
    {
        // logic...
    }
}

在这2行代码中:

public class IndividualUserRepo : BaseUserRepo<IndividualUser>, IIndividualUserRepo

public class LegalUserRepo : BaseUserRepo<LegalUser>, ILegalUserRepo

编译器会触发此错误:

“genericInterfaceTest.IndividualUser”类型不能用作类型 泛型类型或方法中的参数“T” 'genericInterfaceTest.BaseUserRepo'。没有隐式引用 从“genericInterfaceTest.IndividualUser”转换为 'genericInterfaceTest.IBaseUserRepo'。 C:\Work\Tests\genericInterfaceTest\genericInterfaceTest\Program.cs 77 18 genericInterfaceTest

“genericInterfaceTest.LegalUser”类型不能用作类型 泛型类型或方法中的参数“T” 'genericInterfaceTest.BaseUserRepo'。没有隐式引用 从“genericInterfaceTest.LegalUser”转换为 'genericInterfaceTest.IBaseUserRepo'。 C:\Work\Tests\genericInterfaceTest\genericInterfaceTest\Program.cs 91 18 genericInterfaceTest

只有当我在这行代码中实现接口 IBaseUserRepo 时才会发生这种情况:

public class BaseUserRepo<T> where T : BaseUser, IBaseUserRepo<T>

谁能解释一下我哪里错了。

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    我猜你打算在BaseUserRepo&lt;T&gt; 类中实现IBaseUserRepo&lt;T&gt; 接口,但是你所做的却是限制T 应该是基本类型BaseUser 并且T 应该实现IBaseUserRepo&lt;T&gt;

    改变这个

    public class BaseUserRepo<T> where T : BaseUser, IBaseUserRepo<T>
    

    到这里

    public class BaseUserRepo<T> : IBaseUserRepo<T> where T : BaseUser
    

    现在您已经在BaseUserRepo&lt;T&gt; 类中实现了IBaseUserRepo&lt;T&gt; 接口,并将T 泛型参数约束为BaseUser

    订购事宜:)

    【讨论】:

    • Sriram Sakthivel,我现在明白那里发生了什么。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 2016-06-22
    • 2021-11-16
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多