Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用约束的泛型错误_C#_Generics - Fatal编程技术网

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