簡體   English   中英

轉換為抽象的通用基類

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

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