IDタイプが異なる可能性のあるタイプに対応する汎用のGetById(T id)
メソッドを実装しようとしています。私の例では、タイプint
のIDと、タイプstring
の1つのエンティティがあります。
ただし、エラーが発生し続け、理由がわかりません。
タイプ 'int'は、メソッドIEntityのジェネリック型でパラメーター 'TId'として使用するために、参照型である必要があります。
エンティティインターフェイス:
タイプint
またはstring
のIDを持つことができる私のドメインモデルに対応するため。
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...
}
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);
}
}
public interface IEntity<TId> where TId : class
{
TId Id { get; set; }
}
where TId : class
制約では、すべての実装に、intなどの値型には当てはまらないオブジェクトから派生したIDが必要です。
それがエラーメッセージの内容です:The type 'int' must be a reference type in order to use it as parameter 'TId' in the generic type of method IEntity
制約を削除するだけですwhere TId : class
from IEntity<TId>
あなたの質問に:
IDタイプが異なる可能性のあるタイプに対応する汎用GetById(T id)メソッドを実装しようとしています。私の例では、タイプintのIDとタイプstringの1つを持つエンティティ。
public virtual TEntity GetById<TId>(TId id)
{
return context.Set<TEntity>().SingleOrDefault(x => x.Id == id);
}
ジェネリックパラメータの場合は、上記のようなジェネリックメソッドを作成するだけです