0

这可能是一些愚蠢的疏忽,但它是这样的:

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 函数?以及从实体继承的所有其他人?

我只是希望我不会得到太多的反对票。:(

编辑

这就是它将被使用的地方。所以它不会只有两个类。但基本上我模型上的所有类。

    //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;
            }
        }
4

2 回答 2

2

如果问题只是在方法的where子句中放入什么Get,您可以这样做:

public TEntity Get<TEntity, TId> (TId id) where TEntity : Entity<TId>
                                          where TId : IEquatable<TId>
{
  .....
}
于 2012-12-01T21:24:50.097 回答
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);
}
于 2012-12-01T21:35:16.883 回答