繁体   English   中英

"C# - 我可以从具有通用基类型的类派生吗?"

[英]C# - can I derive from class with generic base type?

介绍

我正在使用实体框架创建一个 ASP.NET Web API 应用程序。 我需要做的是为一个 URI 返回同一资源的不同表示,具体取决于用户角色。 例如, api/employees/1将为管理员和标准用户返回两个不同的对象:

标准用户

public class EmployeeBasic 
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

行政

public class EmployeeExtended : EmployeeBasic 
{
    public decimal Salary { get; set; }
}

想法和尝试

对于每个资源表示,我需要提供一些相关的类,例如排序模型。 我想知道是否可以使用泛型类型和继承来为相关表示创建通用存储库方法。 我想到了以下方法:

  1. 为排序模型创建一些基本接口:

     public interface ISortModel<out TBusinessEntity> { // }
  2. 创建泛型 SortModel 作为所有排序模型的基本类型

     public abstract class SortModel<TDBEntity, TBusinessEntity> : ISortModel<TBusinessEntity> { // Database sorting public abstract IQueryable<TDBEntity> ApplyToQuery(IQueryable<TDBEntity> query); // Local sorting public abstract IEnumerable<TBusinessEntity> ApplyToLocal(IEnumerable<TBusinessEntity> localList); // ... // Some private logic (expression mappers, etc.) }
  3. 为基本资源创建排序模型

     public class EmployeeBasicSortModel : SortModel<DBModel.Employee, EmployeeBasic> { public int FullName { get; set; } public override IQueryable<DBModel.Employee> ApplyToQuery(IQueryable<DBModel.Employee> query) { // implementation } public override IEnumerable<EmployeeBasic> ApplyToLocal(IEnumerable<EmployeeBasic> localList) { // implementation } }
  4. 扩展基本排序模型并为扩展资源属性添加排序

     public class EmployeeExtendedSortModel : EmployeeBasicSortModel //, ... Is it possible to somehow do that? { public override IEnumerable<EmployeeExtended> ApplyToLocal(IEnumerable<EmployeeExtended> localList) { var partiallyOrderedList = base.ApplyToLocal(localList); // Add extended sorting } // ... ? }
  5. 使用上述类创建通用服务:

     class EmployeesService() { public IList<TEmployee> GetAll<TEmployee>(ISortModel<TEmployee> sortModel) where TEmployee : BasicEmployee { // implementation } }

问题

当我第一次想到它时,它似乎很简单。 但是当我开始实现这个时,我无法弄清楚实现第 4 步的方法。要么我在我的 C# 知识中遗漏了一些东西(这很可能),要么这在我试图做到这一点的方式中是不可能的。

所以问题是:我可以创建一个具有泛型类型的基类,从它派生出基本资源作为一种类型,然后再派生一次扩展类吗?

天哪,这是一个复杂的问题。 仿制药是一个巨大的红鲱鱼。 忽略泛型; 问题更为根本。 让我们大大简化它。

class Animal {}
class Mammal : Animal {}
class Tiger : Mammal {}

class Shape {}
class Square : Shape {}
class GreenSquare : Square {}

class B
{
  public virtual Mammal Frob(Square s) { ... }
}

class D : B
{
  public override SomeReturnType Frob(SomeArgumentType m) { ... }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM