В Sitecore у меня есть 2 класса, представляющие два возможных узла, которые могут жить как дочерние элементы другого узла. Моя модель содержит свойство Children, которое является IEnumerable <INode> (INode реализуется обоими классами). Во время выполнения я получаю базовый тип каждого ребенка, чтобы идентифицировать их и делать некоторые вещи. Все работает как шарм в моих тестах. Но фактическая реализация не делает.Sitecore, GlassMapper, интерфейсы и динамические прокси
В основном в виде бритвы (наследующий от GlassView, я просматриваю коллекцию дочерних элементов INode и вызываю .GetType() для определения базового класса. Но вместо получения правильного типа я получаю тип IColumnProxy, который является динамический прокси стекла картограф использует для создания модели представления
есть ли способ, чтобы получить фактический тип вместо динамического прокси Благодаря
EDIT:.? вот пример кода:
public interface INode {}
[SitecoreType(TemplateId = "AAAAAAAAA", AutoMap = true)]
public Class NodeType1 : INode
{
public string PropertyA { get; set; }
}
[SitecoreType(TemplateId = "BBBBBBB", AutoMap = true)]
public Class NodeType2 : INode
{
public string PropertyB { get; set; }
}
[SitecoreType(TemplateId = "CCCCCCC", AutoMap = true)]
public class SitecoreItem
{
[SitecoreChildren(InferType=true)]
public virtual IEnumerable<INode> Nodes { get; set; }
}
И по мнению бритвы:
@foreach(var node in item.Nodes)
{
var type = node.GetType(); //INodeProxy
var isNode1 = node is NodeType1; //False
var isNode2 = node is NodeType2; //False
var baseType = node.GetType().BaseType; //DynamicProxy
}
Ссылки на проекты Glass.Mapper и Glass.Mapper.Sc
EDIT: Update 1
Ну, после того, как рыть немного в похоже, GlassMapper делает это так, как я предполагаю, но по какой-то причине это не работает в моем конкретном случае. Что мне недостает? Рекомендации?
Вместо вызова 'GetType()' вы пытались 'if (node MyType)'? http://glass.lu/Mapper/Sc/Tutorials/Tutorial17 – jammykam
Да, я сделал, но это не работает, так как реализация интерфейса каким-то образом скрывается прокси – Hellraiser
Да. это то, что делает GlassMapper - он генерирует свои собственные реализации интерфейса через Castle Windsor. –