簡體   English   中英

在C#中,如何將類型化數組傳遞給泛型函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM