Ошибка при касте класса "Невозможно кастовать"
Я пытаюсь привести класс сущности, который наследует базовый класс, но возвращает нуль.
Ниже приведен класс кода
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.