2016-11-03 8 views
0

基本クラスを継承するエンティティクラスをキャストしようとしていますが、nullを戻しています。以下は「キャストできません」クラスをキャストするときのエラー

コードスニペットクラス

public class CallItem : CallItemBase { 

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

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

} 

かみそりビューは

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

CallItemsあるCallItemはglassmapper性質を持っていることを言及するのを忘れたCallItemBase

のコレクションです。

答えて

1

これは、それはあなたがそれがApp_Start/GlassMapperScCustom.csに行くとGlassLoadersメソッドの内部で、あなたのアセンブリを追加行うには、お使いのモデルのアセンブリを登録する必要があります動作させるために、ガラスマッパーInferTypeです:

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 }; 
    } 

と、ユーザーが定義したクラスであなたは属性InferType=trueを追加する必要があり、子供のようにcallitems:

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リストがあり、そのitensをCallItemにキャストしようとすると、CallItemにはCallItemBaseのすべてのプロパティとそれ自身のプロパティがあるため、機能します。

+0

その本をキャストする際にマップされる追加のプロパティを持つガラスマッパーエンティティはガラスマッパーの古いバージョンではなく、現在のアップグレードバージョン4.2のdoesntの仕事で働きます – CodeBox

1

キーワード "as"は、タイプが正しくない場合はnullを返します。 継承されたクラスを基本クラスにキャストできますが、継承されたクラスの基本クラスはキャストできません。

この質問には多くの回答があります。 は、例えば: Convert base class to derived class

一つの解決策は、CallItemBaseのコレクションを使用することであり、この

var item = i as CallItemBase; 

またはあなたは自分のコレクションはCallItemのいずれかに変換することができますようにそれを行います。

関連する問題