.net 如何将泛型类型强制转换为另一个泛型类型

vhmi4jdf  于 2023-04-07  发布在  .NET
关注(0)|答案(1)|浏览(238)

我正在从一个ORM(Lightspeed)转换到另一个(Entity Framework)。
Lightspeed类继承自Entity基类,而EF类实现IEntity
目前,我在仓库中有以下泛型类型:

public IQueryable<TEntity> GetAll<TEntity>() where TEntity : Entity { ... }
    public IQueryable<TEntity> GetAll_EF<TEntity>() where TEntity : IEntity { ... }

示例用法如下

var claims = repository.GetAll<Claim>();  // Lightspeed
var users = repository.GetAll_EF<User>();  // EF

我希望有一个单独的公共方法来调用适当的更具体的方法。

public static  IQueryable<TEntity> GetAll<TEntity>() where TEntity : class
    {
        if (typeof(Entity).IsAssignableFrom(typeof(TEntity))) // lightspeed
        {
            return GetAll_LS<TEntity>();
        }
        else
        if (typeof(IEntity).IsAssignableFrom(typeof(TEntity))) // EF
        {
            return GetAll_EF<TEntity>();
        }
        else throw new NotImplementedException("xxx");
    }

这会给编译器带来错误
类型“TEnty”不能用作泛型类型或方法“EfMigrationUtils.GetAll_LS()”中的类型参数“TEnty”。没有从“TEnty”到“Mindscape.LightSpeed. Entity”的隐式引用转换。
类型“TEnty”不能用作泛型类型或方法“EfMigrationUtils.GetAll_EF()”中的类型参数“TEnty”。没有从“TEnty”到“Eml.Repository.Base.Abstract. IEntity”的隐式引用转换。
我想要一些方法来告诉编译器Claim是Entity,user是IEntity。

hfyxw5xn

hfyxw5xn1#

你可以尝试使用Cast方法。

if (typeof(Entity).IsAssignableFrom(typeof(TEntity))) // lightspeed
{
    return GetAll_LS<Entity>().Cast<TEntity>();
}
else
if (typeof(IEntity).IsAssignableFrom(typeof(TEntity))) // EF
{
    return GetAll_EF<IEntity>().Cast<TEntity>();
}
else throw new NotImplementedException("xxx");

相关问题