2016-11-03 182 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之一。