MVC3 - 对继承属性的引用失败

时间:2011-05-02 00:47:05

标签: asp.net-mvc

我有一个带有两个派生类的PricingModel类:Recurring和Packaged。在我的家庭控制器中,我做了以下参考:

ViewBag.X = db.PricingModels.Where(x => x.Type == "Packaged").Select(x => x).ToArray(); foreach (var o in ViewBag.X) { var xy = o.Discount; }

工作正常。如果我改为:

var X = db.PricingModels.Where(x => x.Type == "Packaged").Select(x => x).ToArray(); foreach (var o in X) { var xy = o.Discount; }

对o.Discount的引用抱怨:

  

错误2'Website.Models.PricingModel'不包含'Discount'的定义,并且没有扩展方法'Discount'接受类型为'Website.Models.PricingModel'的第一个参数可以找到(你是否错过了使用指令或程序集引用?)C:\ Users \ ekkis \ Documents \ Visual Studio 2010 \ Projects \ SkillScore \ Website \ Controllers \ HomeController.cs 46 32网站

我认为ViewBag.X [0] .Discount是有效的,因为ViewBag是无类型的...值在那里,但编译器不知道它。我的问题是:为什么编译器不能看到派生类的属性?

我尝试过它,但无济于事:

...ToArray().Cast<Packaged>()

也:

var xy = ((Packaged) o).Discount;

所以我错过了什么?

2 个答案:

答案 0 :(得分:0)

我认为最好使用OfType扩展方法而不是Cast。

db.PricingModels.OfType<Packaged>.ToList()

Cast完全相同 - 强制转换,但是ofType实际上只会返回Pacakged类型的项目。 此外,当您将T的对象转换为自身时,不需要Select()。

如果我正确理解您的代码,当类型不是打包类型时,它可能会崩溃。

是的,它与ViewBag一起工作的原因是因为ViewBag是一个动态的,所以没有编译时检查,因为一切都在运行时发生。

答案 1 :(得分:0)

.Cast()不适用于非本机类型。所以我最终做了:

List<PricingModel> Packages = db.PricingModels
   .Where(x => x.Type == "Packaged")
   .ToList();
foreach (Packaged o in Packages) { ... }

工作得很好(最后!)