从另一个通用类类型实例化通用类型

时间:2019-04-14 14:56:43

标签: c# .net generics polymorphism

我试图弄清楚在定义另一个泛型时是否可以使用在一个泛型中定义的类型。这是我实体的一般结构。

public class BaseEntity<T>
{
    T Id {get; set;}
}

public class Company : BaseEntity<int>
{ 

}

请注意,在定义“公司”时,我将ID类型指定为“ int”。我这样做是因为每个实体的ID可能会因类型而异,例如int,guid,long,string等。

当我创建针对这些实体定义的通用服务时,就会出现我的问题,例如

public class EntityService<Tentity> where Tentity : BaseEntity
{
    public IEnumerable Read(Tentity.Id?? id)
    {
    }
}

问题的症结在于,有一种方法可以检索在实体中定义的ID类型(上面为“ int”类型),并在定义服务时使用它,而不必重新定义?

现在我必须这样做。

var companyService = new EntityService<Company, int>();

我宁愿这样做,因为在“公司”实体中已经定义了“ int”。

var companyService = new EntityService<Company>();

最后,我知道我可以将代码切换为从EntityService到实际BaseEntity的所有流程,但是我的实体与基础数据中的此Id类型相关,因此对我不会在实际实体中定义它,因为它不会更改。

解决方法:我必须从EntityService中重新指定要使用的类型,例如

public class EntityService<Tentity, TIdType> where Tentity : BaseEntity  where TIdType : struct, IConvertible
{
    public IEnumerable Read(TIdType id)
    {
    }
}

这是一个问题,当我在EntityService中包装这些通用参数时,如果我实际上不为EntityService提供“ int”,则C#在编译时会抓紧时间,但是我无法从该类型中获取该类型并使用它在我的EntityService类中,而无需重新定义它。

0 个答案:

没有答案