2016-11-03 143 views
0

我试图转换继承基类但返回null的实体类。当铸造类'无法铸造'错误

下面的代码片段类

public class CallItem : CallItemBase { 

[SitecoreField("TitleLink")] 
public virtual Link TitleLink { get; set; } 

SitecoreField("Image")] 
public virtual Image Image { get; set; } 

} 

Razor视图

 @foreach (var i in Model.CallItems) 
    { 
     var item = i as CallItem; //Its null even though i is not null 
    } 

CallItems是CallItemBase

的收集

忘了提,CallItem有glassmapper性能。

回答

1

这是玻璃映射InferType,使其工作,你需要注册你的模型组件,要做到这一点去App_Start/GlassMapperScCustom.cs和里面添加GlassLoaders方法程序集:

public static IConfigurationLoader[] GlassLoaders(){ 

     /* USE THIS AREA TO ADD FLUENT CONFIGURATION LOADERS 
     * 
     * If you are using Attribute Configuration or automapping/on-demand mapping you don't need to do anything! 
     * 
     */ 
     var attributes = new SitecoreAttributeConfigurationLoader("YourAssembly"); 
     return new IConfigurationLoader[]{ attributes }; 
    } 

,并在您定义的类callitems儿童则应添加属性InferType=true

public class YourCollectionClass 
    { 
     [SitecoreChildren(InferType = true)] 
     public virtual IEnumerable<CallItemBase> CallItems{ get; set; } 
    } 
1

您不能根据其基类自动转换类。你可以做其他的事情。

例子:

您有:

public class CallItemBase 
{ 
    public int Prop1 {get;set;} 
    public int Prop2 {get;set;} 
    public int Prop3 {get;set;} 
    public int Prop4 {get;set;} 
} 

public class CallItem : CallItemBase 
{ 
    public int Prop5 {get;set;} 
    public int Prop6 {get;set;} 
} 

如果你施放CallItemBase对象调用项目,当您试图访问Prop5和Prop6代码将打破,因为他们不是在CallItemBase类。但是,如果你有一个CallItemBase列表,并试图将它传递给CallItem,它就可以工作,因为CallItem具有CallItemBase所具有的所有属性以及它自己的属性。

+0

其具有附加属性的玻璃映射实体,在与旧版本的玻璃映射的,但在目前的升级版本4.2不起作用铸造这个工程被映射 – CodeBox

1

如果类型不正确,关键字“as”将返回null。 您可以将继承类转换为基类,但不转换为继承类。

这个问题有很多答案。 例如: Convert base class to derived class

一种解决方案是使用CallItemBase的集合,像这样做

var item = i as CallItemBase; 

,或者你可以你的收藏转换为CallItem之一。