如何在 C# generic class 中将两种可能的类型传递给 T?
How can I pass two possible type to T in C# generic class?
我已经在 Asp.Net Core
应用程序中实现了 Repository Pattern
。我正在为基本存储库使用通用 class:
public class GenericRepository<T> : IDisposable, IGenericRepository<T>, IGenericRepositoryAsync<T>
where T : BaseEntity, new()
{
// Standard methods like: GetById, Update, Delete etc.
}
我的 Domain
之后有特定的存储库:FeedRepository
、UserRepository
。和 Entities
: Post
, ApplicationUser
.
我的 FeedRepository
看起来像这样:
public class FeedRepository : GenericRepository<Post>, IFeedRepository
{
// Specific methods for Feed
}
问题是我需要对所有其他存储库使用 GenericRepository
,但我的 ApplicationUser
实体扩展 IdentityUser
而不是 BaseEntity
.
有没有什么办法可以让 GenericRepository 有两种可能的类型? T
可以有时 BaseEntity
有时 IdentityUser
吗?
嗯,理论上,你可以这样做:
public class GenericRepository<T, TBase> : IDisposable, IGenericRepository<T>, IGenericRepositoryAsync<T>
where T : TBase, new()
{
// Standard methods like: GetById, Update, Delete etc.
}
但我不清楚这会完成什么。通常,当您使用通用条件时,这是因为 class 中的某些东西知道如何以某种特殊方式与条件 (BaseEntity
) 中的类型交互。
如果不是这种情况,那么首先该标准就没有真正的目的,您应该将其删除。
如果 是 情况,您可能应该创建一个单独的存储库类型。例如,您可以有一个 GenericEntityRepository
,然后是一个单独的 IdentityUserRepository
或类似的东西。
我已经在 Asp.Net Core
应用程序中实现了 Repository Pattern
。我正在为基本存储库使用通用 class:
public class GenericRepository<T> : IDisposable, IGenericRepository<T>, IGenericRepositoryAsync<T>
where T : BaseEntity, new()
{
// Standard methods like: GetById, Update, Delete etc.
}
我的 Domain
之后有特定的存储库:FeedRepository
、UserRepository
。和 Entities
: Post
, ApplicationUser
.
我的 FeedRepository
看起来像这样:
public class FeedRepository : GenericRepository<Post>, IFeedRepository
{
// Specific methods for Feed
}
问题是我需要对所有其他存储库使用 GenericRepository
,但我的 ApplicationUser
实体扩展 IdentityUser
而不是 BaseEntity
.
有没有什么办法可以让 GenericRepository 有两种可能的类型? T
可以有时 BaseEntity
有时 IdentityUser
吗?
嗯,理论上,你可以这样做:
public class GenericRepository<T, TBase> : IDisposable, IGenericRepository<T>, IGenericRepositoryAsync<T>
where T : TBase, new()
{
// Standard methods like: GetById, Update, Delete etc.
}
但我不清楚这会完成什么。通常,当您使用通用条件时,这是因为 class 中的某些东西知道如何以某种特殊方式与条件 (BaseEntity
) 中的类型交互。
如果不是这种情况,那么首先该标准就没有真正的目的,您应该将其删除。
如果 是 情况,您可能应该创建一个单独的存储库类型。例如,您可以有一个 GenericEntityRepository
,然后是一个单独的 IdentityUserRepository
或类似的东西。