[英]casting to an abstract generic base class
我有一個從Mvc Controller繼承的抽象泛型類,它使用泛型類型創建項字典,類似於以下內容:
public abstract class BaseController<TElement> : Controller where TElement : BaseElement
{
public Dictionary<string, TElement> Stuff { get; set; }
string Name;
public BaseController()
{
this.Name = Helper.GetName();
this.Stuff = Helper.GetStuff(Name) as Dictionary<string, TElement>;
}
}
然后,我有幾種不同的BaseControllers實現,它們根據命名對象的標准傳入不同類型的BaseElement(我相信這部分是不相關的,但是請告訴我它是否影響我的最終結果)。
問題是稍后我需要檢查一個actionfilter的“ Stuff”屬性是否為null,該actionfilter通過基本Mvc Controller屬性訪問BaseController的實例。
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.Controller as **BaseWidgetController**; // <-- here
if (controller == null)
throw new Exception(filterContext.Controller.GetType().ToString());
}
我的“ BaseController”是一個控制器,因此確實適合該屬性,但是我不知道如何將其強制轉換為我的BaseController類型以獲取Stuff屬性。
能做到嗎? 我在搜索提及協方差時已經看到過,但是我似乎無法回避它,這是我需要做的工作嗎?
我還看到了使用反射作為解決方案,但是這很昂貴,並且無法滿足我的特定情況。
最終我看到,如果我將基類定義為接口而不是抽象類,那么這可以工作,但是我需要該基類行為,因為它將在所有繼承的類型之間共享...
我輸入此問題的主要原因是因為SO總是會提出非常相似的問題,而我通常通常只會找到我的答案,但是這次我真的對協方差和泛型迷失了,因此我可以使用一些見解關於這是否可能,或者我是否應該以完全不同的方式來做...
很難編寫從基類到泛型派生類之一的強類型代碼。 一種選擇是使用dynamic
代碼而不是強類型代碼。
另一個選擇是擁有非通用基類或接口,除非您需要使用特定類型的元素:
interface IHasTheStuff
{
bool HaveStuff();
}
public abstract class BaseController<TElement> : IHasTheStuff, Controller ...
{
...
public bool HaveStuff() { return Stuff != null;}
}
並且比起僅將控制器強制轉換為該接口時:
Controller justController...
if (((IHasTheStuff)justController).HaveStuff())...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.