Ошибка при касте класса "Невозможно кастовать"

Я пытаюсь привести класс сущности, который наследует базовый класс, но возвращает нуль.

Ниже приведен класс кода

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.

3 ответа

Решение

Это стеклянный картограф 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; }
    }

Вы не можете автоматически разыграть класс на основе его базового класса. Вы можете сделать наоборот.

Пример:

у тебя есть:

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, плюс свои собственные свойства.

Ключевое слово "as" возвращает ноль, если тип неверный. Вы можете преобразовать унаследованный класс в базовый класс, но не в базовый класс в унаследованный класс.

Есть много ответов на этот вопрос. например: преобразовать базовый класс в производный класс

Одним из решений является использование коллекции CallItemBase и сделать это следующим образом

 var item = i as CallItemBase;

или вы можете просто преобразовать свою коллекцию в коллекцию CallItem.

Другие вопросы по тегам