忽略泛型类型的类型参数约束



我有EntityBase抽象类,通常我所有的实体都继承自它。它采用指定 Id 属性类型的泛型类型(例如 int 或 Guid(。实体库还包含一些用于确定实体之间相等的逻辑。

public abstract class EntityBase<T>
{
public T Id { get; private set; }
...
}

在我的 .Net Core 2.2 Web 应用程序中,我使用的是 Asp.Net Identity,并且我有一个名为 ApplicationUser 的实体,该实体必须继承自 Microsoft.AspNetCore.Identity.IdentityUser。因为不可能从多个基类继承,所以我不能从 EntityBase 继承。

因此,我创建了一个名为IEntity的接口,EntityBase和ApplicationUser都实现了该接口。

public interface IEntity<T>
{
T Id { get; }
} 

我有一个 IRepository 接口,该接口具有必须是实体的泛型类型。我不在乎该实体上的 Id 类型是什么。我只是想说,TEntity只需要是一些IEntity,我不在乎它是IEntity还是IEntity。像下面这样。这可能吗?

public interface IRepository<TEntity> where TEntity : IEntity
{
}

约束IEntity<T>的唯一方法是说:

public interface IRepository<TEntity, TId> where TEntity : IEntity<TId>
{
} 

您需要指定类型参数。如果您考虑一下,忽略IEntity<T>T的约束将毫无用处:您将无法使用Id属性,因为您不知道其类型,这是IEntity<T>唯一签约的东西。

如果你说你不在乎Id的类型,那么,你为什么要在乎那个东西是IEntity<T>呢?

您可以创建一个没有所有实体派生自的参数的接口

public interface IEntity
{
}
public interface IEntity<out T> : IEntity
{
T Id { get; }
}
public abstract class EntityBase<T> : IEntity<T>
{
public T Id { get; private set; }
}
public interface IRepository<TEntity> where TEntity: IEntity
{
}

相关内容

  • 没有找到相关文章

最新更新