在转换类'无法转换'时出错

时间:2016-11-03 16:01:11

标签: c# asp.net-mvc sitecore glass-mapper

我试图转换继承基类但返回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属性。

3 个答案:

答案 0 :(得分: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对象强制转换为call item,则在尝试访问Prop5和Prop6时代码会中断,因为它们不在CallItemBase类中。

但是,如果您有一个CallItemBase列表并尝试将其itens转换为CallItem,那么它将起作用,因为CallItem具有CallItemBase具有的所有属性,以及它自己的属性。

答案 1 :(得分:1)

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

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

一种解决方案是使用CallItemBase的集合并像这样执行

 var item = i as CallItemBase;

或者您可以将您的收藏转换为CallItem收藏。

答案 2 :(得分: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; }
    }