2016-11-03 2 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 CallItemBase

의 수집

이 CallItem가 glassmapper 특성을 가지고 있음을 언급하는 것을 잊었다입니다에게 있습니다.

답변

1

이 유리 매퍼 InferType은 당신이 그 App_Start/GlassMapperScCustom.cs로 이동 GlassLoaders 방법 내부 어셈블리를 추가 할, 모델 어셈블리를 등록해야 작동하도록한다 당신이 속성 InferType=true를 추가해야 자식으로 callitems :

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

클래스를 기본 클래스를 기반으로 자동 캐스트 할 수 없습니다. 다른 방향으로 할 수 있습니다.

예 :

당신은 : 당신이 항목을 호출 할 CallItemBase 개체를 캐스팅 경우 Prop5 및 Prop6에 액세스하려고 할 때

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에되지 않기 때문에 수업.

그러나 CallItemBase 목록이 있고 CallItem으로 itent를 캐스팅하려고하면 CallItem에 CallItemBase에있는 모든 속성과 자체 속성이 있기 때문에 itItes가 작동합니다.

+0

그것이를 캐스팅하는 것이 유리 매퍼의 이전 버전과 함께하지만, 현재의 업그레이드 버전 4.2 나던 작업에서 작동 할 때 매핑됩니다 추가 속성을 가진 유리 매퍼 엔티티 – CodeBox

1

키워드 "as"는 유형이 올바르지 않으면 null을 반환합니다. 상속 된 클래스를 기본 클래스로 캐스팅 할 수 있지만 상속 된 클래스의 기본 클래스는 캐스팅 할 수 없습니다.

이 질문에 대한 답변이 많습니다. 예를 들어 : Convert base class to derived class

한 가지 해결책은 CallItemBase의 컬렉션을 사용하고이

var item = i as CallItemBase; 

같이하는 것입니다 또는 당신은 단지 CallItem 하나에 컬렉션을 변환 할 수 있습니다.

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

와 사용자가 정의하는 클래스 :

관련 문제