如何在C#泛型类中将两个可能的类型传递给T?

时间:2019-05-13 14:47:30

标签: c# asp.net-core repository-pattern generic-programming

我已经在Repository Pattern应用程序中实现了Asp.Net Core。我将通用类用于基础存储库:

public class GenericRepository<T> : IDisposable, IGenericRepository<T>, IGenericRepositoryAsync<T>
    where T : BaseEntity, new()
{
    // Standard methods like: GetById, Update, Delete etc.
}

我在Domain之后有特定的存储库:FeedRepositoryUserRepository。还有EntitiesPostApplicationUser

我的FeedRepository如下:

public class FeedRepository : GenericRepository<Post>, IFeedRepository
{
    // Specific methods for Feed
}

问题是我需要对所有其他存储库使用GenericRepository,但是我的ApplicationUser实体扩展了IdentityUser而不是BaseEntity

有没有办法为GenericRepository提供2种可能的类型? T有时是BaseEntity有时是IdentityUser吗?

1 个答案:

答案 0 :(得分:2)

从理论上讲,您可以这样做:

public class GenericRepository<T, TBase> : IDisposable, IGenericRepository<T>, IGenericRepositoryAsync<T>
    where T : TBase, new()
{
    // Standard methods like: GetById, Update, Delete etc.
}

但是我不清楚会完成什么。通常,当您使用通用条件时,这是因为类中的某些人知道如何以某种特殊方式与条件(BaseEntity)中的类型进行交互。

如果不是这种情况,那么该标准就没有真正的目的,您应该删除它。

如果是 情况,则可能应该创建一个单独的存储库类型。例如,您可以有一个GenericEntityRepository,然后有一个单独的IdentityUserRepository或类似的东西。