【问题标题】:Error when casting class 'Unable to cast'投射类“无法投射”时出错
【发布时间】:2017-03-17 07:31:10
【问题描述】:

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

下面是sn-p类的代码

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

【问题讨论】:

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


    【解决方案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; }
        }
    

    【讨论】:

      【解决方案2】:

      您不能根据基类自动转换类。你可以反过来做。

      例子:

      你有:

      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 的所有属性,以及它自己的属性。

      【讨论】:

      • 它是一个具有附加属性的玻璃映射器实体,在投射时会被映射,它适用于旧版本的玻璃映射器,但在当前升级的 4.2 版中不起作用
      【解决方案3】:

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

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

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

       var item = i as CallItemBase;
      

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

      【讨论】: