获取通用参数的通用函数

时间:2012-12-01 20:57:40

标签: c# generics

这可能是一些愚蠢的疏忽,但在这里:

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

2 个答案:

答案 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);
}