我正在尝试实现一种通用GetById(T id)
方法,该方法将满足可能具有不同ID类型的类型。在我的示例中,我有一个实体,其ID为int
,类型为string
。
然而,我一直收到错误,我不明白为什么:
类型'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...
}
答案 0 :(得分:7)
您应该从Repository
类
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);
}
}
答案 1 :(得分:4)
public interface IEntity<TId> where TId : class
{
TId Id { get; set; }
}
where TId : class
约束要求每个实现都有一个从对象派生的Id,对于像int这样的值类型,它不是真的。
这是错误消息告诉您的内容: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
IEntity<TId>
即可
答案 2 :(得分:1)
您的问题:
我正在尝试实现一个通用的GetById(T id)方法,该方法将满足可能具有不同ID类型的类型。在我的示例中,我有一个实体,其ID类型为int,类型为string。
public virtual TEntity GetById<TId>(TId id)
{
return context.Set<TEntity>().SingleOrDefault(x => x.Id == id);
}
对于通用参数,只需制作如上所述的通用方法