这是对another question的跟进,在那里我收到了很多很棒的评论和回答。这个问题提出了这个问题。
假设我有以下抽象类:
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>
扩展的类作为泛型参数传递?
发布于 2013-11-26 06:46:34
将您的接口更改为泛型:
public interface IQueryEntities<TId>
{
IQueryable<TEntity> Query<TEntity>() where TEntity : Entity<TId>;
}
然后当您实现它时:
public class EntityAbc : Entity<string>, IQueryEntities<string>
也可能是他的:
public abstract class Entity<TId> : IEquatable<Entity<TId>>, IQueryEntities<TId>
所以要更新以反映评论。使该接口具有通用性仍然是一种方法。如果您不希望实现接口的实体没有问题,您可以这样做:
public class QueryEntities<TId> : IQueryEntities<TId>
{
public IQueryable<TEntity> Query<TEntity>()
where TEntity : Entity<TId>
{
...
}
}
使用它可能如下所示:
var queries = new QueryEntities<string>();
queries.Query<EntityAbc>();
但是,除非使方法本身接收到TIn
,否则无法将任何实体发送到该接口。如果要使方法本身像这样泛化,那么代码当然是这样的:
var queries = new QueryEntities();
queries.Query<EntityAbc, string>();
该接口如下所示:
public interface IQueryEntities
{
IQueryable<TEntity> Query<TEntity, TId>() where TEntity : Entity<TId>;
}
但你不想那样。
发布于 2013-11-26 06:48:32
我不确定你的问题是否正确,只是随便猜测一下,这对你有用吗?
IQueryable<Entity<TId>> Query<TId>();
https://stackoverflow.com/questions/20220120
复制