![](/img/trans.png)
[英]Convert generic parameter with 'where' type constraint not possible?
[英]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.