C# 应用约束的泛型错误
我在课堂上有这些模型:C# 应用约束的泛型错误,c#,generics,C#,Generics,我在课堂上有这些模型: public abstract class ModelBase<T> { public virtual T Id { get; set; } } public class Table: ModelBase<int> { public string Name { get; set; } } 如何推断表中的类型在本例中是int还是对它的引用 TEntity在本例中是表您非常接近。为了在示例中使用T,您需要提供该类型。为了提供类型,需要将
public abstract class ModelBase<T>
{
public virtual T Id { get; set; }
}
public class Table: ModelBase<int>
{
public string Name { get; set; }
}
如何推断表中的类型在本例中是int
还是对它的引用
TEntity
在本例中是表
您非常接近。为了在示例中使用T
,您需要提供该类型。为了提供类型,需要将其传递给类构造函数,以便将其包含在定义中。你可以像这样包括它
public class Repository<TEntity,T>
//^ Include the type in the definition
: IRepository<TEntity> where TEntity
: ModelBase<T>
公共类存储库
//^在定义中包含类型
:i假定在何处有触角
:ModelBase
现在,当您实例化时,您需要同时传递表和表的类型
var repo = new Repository<Table,int>();
var repo=new Repository();
我相信,主键的变体数量不会太多。因此,您可以轻松做到这一点:
public class TableWithIntId : ModelBase<int>
{
}
public class TableWithGuidId : ModelBase<Guid>
{
}
public class Repository<TEntity, T> : IRepository<TEntity>
where TEntity : ModelBase<T>
{
}
public class TableWithIntIdRepository<TTable> : Repository<TTable, int>
where TTable : TableWithIntId
{
}
public class TableWithGuidIdRepository<TTable> : Repository<TTable, Guid>
where TTable : TableWithGuidId
{
}
公共类表withintid:ModelBase
{
}
公共类TableWithGuidId:ModelBase
{
}
公共类存储库:IRepository
其中tenty:ModelBase
{
}
公共类TableWithInitdRepository:存储库
表的位置:TableWithinId
{
}
公共类TableWithGuidRepository:Repository
表的位置:TableWithGuided
{
}
当您需要为每个T
创建一个存储库
子代,但不是为每个实体创建子代时,这种情况就出现了。我发现这个解决方案很容易实现。我创建了一个解决问题的类ModelBaseIdentity
:
public abstract class ModelBase
{
// code
}
public abstract class ModelBaseIdentity<T>: ModelBase
{
public virtual T Id { get; set; }
}
public class Table: ModelBaseIdentity<int>
{
public string Name { get; set; }
}
public class Repository<TEntity>
: IRepository<TEntity> where TEntity
: ModelBase
公共抽象类模型库
{
//代码
}
公共抽象类ModelBaseIdentity:ModelBase
{
公共虚拟T Id{get;set;}
}
公共类表:ModelBaseIdentity
{
公共字符串名称{get;set;}
}
公共类存储库
:i假定在何处有触角
:ModelBase
为什么不使用ModelBase
?@AntP我不能简单地说ModelBase
,因为它需要类型
,但是我不知道在表格中的那个家伙是什么,因为我有很多tables@RohitVats因为在本例中,我需要为每个存储库创建一个存储库类type@andresdescalzo:您希望数据库中有多少个T
的变体?@Dennis我知道,很少是类型2或类型3,我已经考虑过这个替代方案,但我的服务层需要为每个表提供所有类型的“ID”,这似乎不是一个好的解决方案。@andresdescalzo-您设计ID的方式要求以这种方式传递其类型。这种方法似乎是在架构之上实现的最干净、最直接的方法。
public abstract class ModelBase
{
// code
}
public abstract class ModelBaseIdentity<T>: ModelBase
{
public virtual T Id { get; set; }
}
public class Table: ModelBaseIdentity<int>
{
public string Name { get; set; }
}
public class Repository<TEntity>
: IRepository<TEntity> where TEntity
: ModelBase