![](/img/trans.png)
[英]C# - In a Generic Class, How Can I Set a Generically-Typed Function Delegate?
[英]In C#, how can I pass typed array into generic function?
我有一個收藏:
IQueryable<Car>
我想傳遞給一個以參數為參數的通用函數:
IQueryable<T>
像(坐在基類中)
public abstract class BaseController<T> : ControllerBase where T : BaseObj, new()
{
public IQueryable<T> FilterEntities(IQueryable<T> entities)
{
}
}
正確的方法是什么? 演員?安全演員?
public IQueryable<TQueryable> FilterEntities<TQueryable>(
IQueryable<TQueryable> entities)
{
}
您需要使該方法成為通用方法(函數名稱后面的<T>在Parens告訴編譯器該方法是通用方法之前)。
方法的類型參數TQueryable
與類類型不同。 如果您不想要它,則方法簽名應該沒問題。
您的問題是您的方法不是通用的,類是。 注意,在方法名之后沒有<T>
,這意味着您必須傳遞一個IQueryable,該IQueryable是您為類的類型參數使用的內容。
例如,如果對象是這樣實例化的:
new BaseController<BaseObject>(..) //ignoring that BaseController is abstract
您需要傳遞一個IQueryable<BaseObject>
因此在您希望傳遞IQueryable<Car>
的情況下,需要從BaseController<Car>
派生控制器的類型
另一方面,如果您希望該方法是通用的,請將方法的簽名更改為
public IQueryable<TElement> FilterEntities<TElement>
(IQueryable<TElement> entities)
不包含您在類的類型參數上具有的T上的類型約束。 如果應為通用方法強制執行此操作,則簽名必須為:
public IQueryable<TElement> FilterEntities<TElement>(IQueryable<TElement> entities)
where TElement : BaseObj, new()
編輯如果您希望有一個僅使用T作為類型參數的“默認”方法,則必須像代碼中那樣將其實現為非通用方法,因此該類將是:
public abstract class BaseController<T> : ControllerBase
where T : BaseObj, new()
{
public IQueryable<T> FilterEntities(IQueryable<T> entities)
{
return FilterEntities<T>(entities);
}
public IQueryable<TElement> FilterEntities<TElement>(IQueryable<TElement> entities)
where TElement : BaseObj, new()
}
如下定義FilterEntities
public IQueryable<T> FilterEntities<T>(IQueryable<T> entities)
{
}
現在您可以通過IQueryable如下
IQueryable<Car> x = null; //Initialize it
FilterEntities<Car>(x);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.