繁体   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