Ограничение параметра типа, игнорирующее универсальный тип - PullRequest
0 голосов
/ 14 октября 2019

У меня есть абстрактный класс EntityBase, от которого обычно наследуются все мои сущности. Он принимает универсальный тип, который указывает тип свойства Id (например, int или Guid). EntityBase также содержит некоторую логику для определения равенства между сущностями.

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

    ...
}

В моем веб-приложении .Net Core 2.2 я использую Asp.Net Identity и у меня есть объект с именем ApplicationUser, который должен наследоваться от Microsoft. AspNetCore.Identity.IdentityUser. Поскольку невозможно наследовать от нескольких базовых классов, я не могу наследовать от EntityBase.

Итак, я создал интерфейс с именем IEntity, который и EntityBase, и ApplicationUser реализуют

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

У меня естьинтерфейс IRepository с универсальным типом, который должен быть сущностью. Мне все равно, какой тип идентификатора на этой сущности. Я просто хочу сказать, что TEntity просто должен быть IEntity, и мне все равно, IEntity это или IEntity. Что-то вроде ниже. Это возможно?

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

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Единственный способ ограничения на IEntity<T> заключается в следующем:

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

Вам необходимо указать параметр типа. Если подумать, то ограничение, игнорирующее T в IEntity<T>, будет бесполезным: вы не сможете использовать свойство Id, потому что вы не будете знать его тип, и это единственноеэто сокращается IEntity<T>.

Если вы говорите, что вас не волнует тип Id, тогда почему же вас волнует, что эта вещь вообще является IEntity<T>?

0 голосов
/ 14 октября 2019

Вы можете создать интерфейс без параметра, который все сущности получают из

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