【发布时间】:2014-02-19 04:07:10
【问题描述】:
我有一个从 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>;
}
}
然后我有几个不同的 BaseController 实现,它们根据命名对象的标准传入不同类型的 BaseElement(我相信这部分无关紧要,但如果它影响我的最终结果,请告诉我)。
问题是稍后我需要检查动作过滤器中的“Stuff”属性是否为空,该动作过滤器通过基本 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 总是会提出非常相似的问题,而我通常最终会找到我的答案,但这次我真的迷失了协方差和泛型,所以我可以使用一些洞察力来判断这是否可能,或者我是否应该以完全不同的方式这样做......
【问题讨论】:
-
也许我有一个缓慢的时刻。如果
Thing继承自BaseThing,它不是已经拥有Stuff属性了吗? -
我也是这么想的。除非
ChildTing类之一覆盖或隐藏/隐藏它(以某种方式更改功能),否则如果它进入null,那么它实际上可能只是null。 -
另外,
Helper.GetStuff(Name)是否真的返回了一些东西?如果它返回一些东西,你是否 100% 确定它是Dictionary<string, TElement>类型?如果不是,那么as运算符将在您的构造函数中默认this.Stuff为null。 -
实际上我想我可能解释错了,因为我试图使其尽可能通用以避免使事情复杂化。这是在 MVC 的上下文中,让我更新它以更好地解释我正在尝试做什么
-
derviedOrBase.Stuff != null或者我错过了什么?您能否发布您尝试在无法访问Stuff的地方工作的代码?
标签: c# generics casting abstract-class