異なる ID タイプを持つ可能性のあるタイプに対応する汎用メソッドを実装しようとしていますGetById(T id)
。私の例では、タイプ の ID を持つエンティティint
と、タイプ の IDを持つエンティティがありますstring
。
しかし、エラーが発生し続けますが、その理由はわかりません。
'int' 型は、メソッド IEntity のジェネリック型でパラメータ 'TId' として使用するには参照型である必要があります。
エンティティ インターフェイス:
int
または のタイプの ID を持つことができるドメイン モデルに対応するためですstring
。
public interface IEntity<TId> where TId : class
{
TId Id { get; set; }
}
エンティティ実装:
public class EntityOne : IEntity<int>
{
public int Id { get; set; }
// Other model properties...
}
public class EntityTwo : IEntity<string>
{
public string Id { get; set; }
// Other model properties...
}
汎用リポジトリ インターフェース:
public interface IRepository<TEntity, TId> where TEntity : class, IEntity<TId>
{
TEntity GetById(TId id);
}
汎用リポジトリの実装:
public abstract class Repository<TEntity, TId> : IRepository<TEntity, TId>
where TEntity : class, IEntity<TId>
where TId : class
{
// Context setup...
public virtual TEntity GetById(TId id)
{
return context.Set<TEntity>().SingleOrDefault(x => x.Id == id);
}
}
リポジトリの実装:
public class EntityOneRepository : Repository<EntityOne, int>
{
// Initialise...
}
public class EntityTwoRepository : Repository<EntityTwo, string>
{
// Initialise...
}
ベストアンサー1
Repository
クラスからTIdの制約を削除する必要があります
public abstract class Repository<TEntity, TId> : IRepository<TEntity, TId>
where TEntity : class, IEntity<TId>
{
public virtual TEntity GetById(TId id)
{
return context.Set<TEntity>().Find(id);
}
}