![](/img/trans.png)
[英]In C# 4.0, is it possible to derive a class from a generic type parameter?
[英]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; }
}
想法和嘗試
對於每個資源表示,我需要提供一些相關的類,例如排序模型。 我想知道是否可以使用泛型類型和繼承來為相關表示創建通用存儲庫方法。 我想到了以下方法:
為排序模型創建一些基本接口:
public interface ISortModel<out TBusinessEntity> { // }
創建泛型 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.) }
為基本資源創建排序模型
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 } }
擴展基本排序模型並為擴展資源屬性添加排序
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 } // ... ? }
使用上述類創建通用服務:
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.