这可能是一些愚蠢的疏忽,但在这里:
public class Entity<TId> where TId : IEquatable<TId>
{
public virtual TId Id { get; private set; }
}
public class Client : Entity<Guid> { }
public class State : Entity<short> { }
public class Helper
{
protected IList<Client> clients;
protected IList<State> states;
//Works
public T Get<T>()
{
return default(T);
}
public T Get<T>(Guid id) where T : Entity<Guid>
{
return default(T);
}
public T Get<T>(short id) where T : Entity<short>
{
return default(T);
}
}
如何编写适用于这两个类的Get函数?还有从Entity继承的其他所有内容吗?
我只是希望我不会得到太多的downvotes。 :(
修改
这是它的用武之地。所以它不仅仅是两个班级。但基本上我模型上的所有类。
//What should I declare here?
{
TEntity result = default(TEntity);
try
{
using (var tx = session.BeginTransaction())
{
result = session.Query<TEntity>().Where(e => e.Id == Id).FirstOrDefault();
}
return result;
}
catch (Exception ex)
{
throw;
}
}
使用SWeko提供的解决方案
public TEntity Get<TEntity, TId>(TId Id)
where TEntity : Entity<TId>
where TId : IEquatable<TId>
{
try
{
TEntity result = default(TEntity);
using (var tx = statefullSession.BeginTransaction())
{
result = statefullSession.Query<TEntity>().Where(e => e.Id.Equals(Id)).FirstOrDefault();
}
return result;
}
catch (Exception ex)
{
throw;
}
}
答案 0 :(得分:2)
如果问题只是放在where
方法的Get
子句中的内容,您可以这样做:
public TEntity Get<TEntity, TId> (TId id) where TEntity : Entity<TId>
where TId : IEquatable<TId>
{
.....
}
答案 1 :(得分:0)
我认为不需要通用Get
方法,因为您希望从预定义的两个列表中返回事先已知类型的对象(客户端,状态)。
public class Helper
{
protected IList<Client> clients;
protected IList<State> states;
public Client GetClient(Guid id)
{
return clients.Where(c => c.Id == id);
}
public State GetState(short id)
{
return states.Where(s => s.Id == id);
}
}
考虑将字典用于速度,其中id用作密钥。
或者,您可以将两个公共Get方法基于一个私有泛型Get方法
private TEntity Get<TEntity,TId>(IList<TEntity> list, TId id)
{
return list.Where(item => item.Id == id);
}
public Client GetClient(Guid id)
{
return Get(clients, id);
}
public State GetState(short id)
{
return Get(states, id);
}