2011-11-05 47 views
3

我試圖寫一個通用的基類,這將允許子類傳遞一個接口作爲類型,然後在泛型上有基類調用方法,但我不知道如何去做...如何從這種一般情況下獲得類型?

public class BaseController<T> : Controller where T : IPageModel 
{ 
    public virtual ActionResult Index() 
    { 
     IPageModel model = new T.GetType(); 

     return View(model); 
    } 
} 

這不能編譯,當涉及到泛型時,我得到了棒的錯誤結局嗎?

回答

6

我想你想:

public class BaseController<T> : Controller where T : IPageModel, new() 
{ 
    public virtual ActionResult Index() 
    { 
     IPageModel model = new T(); 
     return View(model); 
    } 
} 

注意new()約束上T。 (更多信息請參見MSDN on generic constraints

如果沒有需要對應TType參考,你會使用typeof(T) - 但我不認爲你需要它在這種情況下。

+0

謝謝喬恩,是什麼在年底新的位呢?在基類實例化時確保類型是'新建'? – Exitos

+1

@ Pete2k:不 - 這裏沒有繼承。它只是要求'T'有一個無參數的構造函數。我會編輯一個鏈接到我的答案。 –

1

你應該做的波紋管,使創建實例:

public class BaseController<T> : Controller where T :IPageModel,new() 
{ 
    public virtual ActionResult Index() 
    { 
     IPageModel model = new T(); 

     return View(model); 
    } 

}