转换时出错 class 'Unable to cast'

Error when casting class 'Unable to cast'

我正在尝试转换继承基础 class 但返回 null 的实体 class。

下面是代码片段class

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 属性。

您不能根据 class 的基础自动施放 class。你可以反过来做。

示例:

你有:

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 class.

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

关键字"as" return 如果类型不正确则为null。 您可以将继承的 class 转换为基数 class,但不能将基数 class 转换为继承的 class.

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

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

 var item = i as CallItemBase;

或者您可以将您的集合转换为 CallItem 集合。

这是玻璃映射器 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 };
    }

并且在 class 中您将调用项定义为子项,您应该添加属性 InferType=true :

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