Это продолжение еще одного вопроса, на который я получил много замечательных комментариев и ответов. Этот вопрос поднял этот.
Скажем, у меня есть следующий абстрактный класс:
public abstract class Entity<TId> : IEquatable<Entity<TId>>
{
public TId Id { get; protected set; }
// plus implementation of IEquatable, GetHashCode override, etc.
}
Другой вопрос, который я задал, касался реализации интерфейса для команд сущностей, который теперь выглядит так:
public interface ICommandEntities
{
void Create<TId>(Entity<TId> entity);
void Update<TId>(Entity<TId> entity);
void Delete<TId>(Entity<TId> entity);
void Reload<TId>(Entity<TId> entity);
}
Раньше я пытался выяснить, как это сделать с ограничениями универсального типа, чтобы ограничить аргументы метода типом Entity<TId>
. Ответы на предыдущий вопрос сказали мне, что мне не нужно этого делать, я могу просто использовать свой абстрактный класс в качестве аргумента метода.
Однако я до сих пор не понимаю, как я могу сделать следующее, когда метод интерфейса не имеет аргументов?
public interface IQueryEntities
{
IQueryable<TEntity> Query<TEntity>() where TEntity : ???????;
}
При вызове этого метода я хочу передать только один общий аргумент, например:
var queryable1 = queries.Query<EntityAbc>();
var queryable2 = queries.Query<EntityXyz>();
... где классы сущностей могут выглядеть примерно так:
public class EntityAbc : Entity<string> {...}
public class EntityXyz : Entity<int> {...}
Как я могу ограничить метод интерфейса, чтобы он позволял передавать в качестве универсального аргумента только классы, которые расширяются от Entity<TId>
?