簡體   English   中英

忽略泛型類型的類型參數約束

[英]Type parameter constraint that disregards generic type

我有 EntityBase 抽象 class 通常我的所有實體都繼承自。 它采用指定 Id 屬性類型的泛型類型(例如 int 或 Guid)。 EntityBase 還包含一些邏輯來確定實體之間的相等性。

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

    ...
}

在 my.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
{
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM