Могу ли я иметь несколько ограничений класса, не устанавливая ограничение на тип «класс» в С#

У меня есть этот класс, он является частью моего шаблона спецификации. Перейдя по этой ссылке

public class SpecificationEvaluator<TEntity> 
   where TEntity : BaseEntity

а BaseEntity состоит только из идентификатора

ex.

public class BaseEntity
{
   public int Id { get; set; }
}

и это отлично работает для всех моих сущностей, которые наследуют «BaseEntity»

ex.

Product : BaseEntity
Invoice : BaseEntity
Message : BaseEntity

теперь я хочу использовать шаблон спецификации для своего объекта «Пользователь», чтобы я мог предоставлять спецификации/условия и получать списки пользователей.

Но моя проблема в том, что объект «Пользователь» моих проектов не наследует «BaseEntity», он наследует «IdentityUser».

ex.

public class User : IdentityUser<int>
{
}

Я знаю, что у меня не может быть несколько классов в качестве ограничений, но я могу иметь несколько интерфейсов.

Я знаю, что могу установить ограничение только на «класс».

ex.

public class SpecificationEvaluator<TEntity> 
where TEntity : class
{
}

но разве это не противоречит цели создания конкретных ограничений?

ВОПРОС. Есть ли другое решение, которое я могу реализовать, чтобы иметь ограничения «BaseEntity» и «User»?


person user1186050    schedule 20.09.2020    source источник
comment
Нет, предложение where contrainst еще не допускает логику ИЛИ.   -  person Olivier Rogier    schedule 21.09.2020
comment
Отвечает ли это на ваш вопрос? Ограничение типа множественного метода (OR)   -  person Olivier Rogier    schedule 21.09.2020


Ответы (1)


Мне кажется, что вам, возможно, придется сделать это:

public interface IIdentityUser<T>
{
    T Id { get; set; }
}

public class SpecificationEvaluator<TEntity, T>
    where TEntity : IIdentityUser<T>
{ }

public class BaseEntity : IIdentityUser<int>
{
    public int Id { get; set; }
}

public class Product : BaseEntity { }
public class Invoice : BaseEntity { }
public class Message : BaseEntity { }

public class IdentityUser<T> : IIdentityUser<T>
{
    public T Id { get; set; }
}

public class User : IdentityUser<int>
{
}
person Enigmativity    schedule 20.09.2020