c# 如何处理这种泛型约束?

标签 c# generics casting

我有三个处理三个基类的通用存储库:

public class Entity
{
    public int Id { get; set; }
}

public class Repository
{
    public TEntity[] GetAll<TEntity>() where TEntity : Entity
    {
        return _context.Set<TEntity>.ToArray();
    }
}

public class ArchiveEntity : Entity
{
    public bool Deleted { get; set; }
}

public class ArchiveRepository
{
    public TEntity[] GetAll<TEntity>() where TEntity : ArchiveEntity
    {
        return _context.Set<TEntity>.Where(x => x.Deleted == false).ToArray();
    }
}

public class LogicalStorageEntity : ArchiveEntity
{
    public int StorageId { get; set; }
}

public class LogicalStorageRepository
{
    public int CurrentStorageId { get; set; }

    public TEntity[] GetAll<TEntity>() where TEntity : LogicalStorageEntity
    {
        return _context.Set<TEntity>
            .Where(x => x.Deleted == false)
            .Where(x => x.StorageId = CurrentStorageId)
            .ToArray();
    }
}

有没有办法让一个存储库根据基类以不同的方式过滤实体?看起来像这样的东西:

public class Entity
{
    public int Id { get; set; }
}

public class ArchiveEntity : Entity
{
    public bool Deleted { get; set; }
}

public class LogicalStorageEntity : ArchiveEntity
{
    public int StorageId { get; set; }
}

public class UniversalRepository
{
    public TEntity[] GetAll<TEntity>() where TEntity : Entity
    {
        if (typeof(TEntity) is LogicalStorageEntity)
        {
            return _context.Set<TEntity>
                .Where(x => /* how to filter by x.Deleted */)
                .Where(x => /* how to filter by x.StorageId */)
                .ToArray();
        }

        if (typeof(TEntity) is ArchiveEntity)
        {
            return _context.Set<TEntity>
                .Where(x => /* how to filter by x.Deleted */)
                .ToArray();
        }

        return _context.Set<TEntity>.ToArray();
    }
}

编辑。问题不是关于如何检查实体是否属于特定类型。真正困难的部分是当您知道实体可以通过“已删除”或某些其他属性进行过滤时应用过滤器。由于存在 TEntity : Entity 限制,因此您无法访问 Deleted 属性。

最佳答案

您可以通过强制转换来完成此操作,但我会质疑仅执行非泛型功能的泛型方法的有用性。

我的意思是,如果没有针对多种类型执行的通用代码,那么在我看来,您实际上也可以在特定于类的派生中实现它。

关于c# 如何处理这种泛型约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13801957/

相关文章:

将具有两列的data.frame reshape 为具有数据的多列(R)

c# - 将 MyClass<TDescendent> 转换为 MyClass<TAncestor>

c# - 在 C# 中创建 RTF 文件的正确方法是什么?

c# - 即使在 CallBase = true/false 之后,原始方法仍然在 Moq 中被调用

c# - 为什么 Func<> 和 Expression<Func<>> 可以互换?为什么一个对我有用?

java - 在参数匹配器中指定泛型类类型

c# - [通用 Windows 平台] 中的 System.Net.Http.HttpClient 无法正常工作

c# - 抽象泛型父类可以自动获取子(扩展)类型吗?

c++ - 将数组各种类型传递给微 Controller 上的规则引擎的要求。类型转换有问题

C# 泛型转换异常