我有一个带有两个派生类的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;
所以我错过了什么?
答案 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) { ... }
工作得很好(最后!)