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関数をどのように作成すればよいですか?そして、エンティティから継承する他のすべてのものとは?

反対票が多すぎないことを願っています。:(

編集

これが使用される場所です。したがって、2つのクラスだけではありません。しかし、基本的に私のモデルのすべてのクラス。

    //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事前定義された2つのリストから事前にわかっているタイプ(クライアント、状態)のオブジェクトを返したいので、ジェネリックメソッドの必要性はわかりません。

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がキーとして使用される場合、速度のために辞書を使用することを検討してください。


または、2つのパブリックGetメソッドを1つのプライベートジェネリック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 に答える