在Sitecore中,我有2个类,代表2个可能作为另一个节点的子节点生存的节点。 我的模型包含一个Children属性,它是一个IEnumerable< INode> (两个类都实现了INode)。在运行时,我得到每个孩子的基础类型来识别它们并做一些事情。 在我的测试中,一切都像魅力一样。但实际的实施却没有。
基本上在剃刀视图中(继承自GlassView,我循环遍历INode子集合并调用.GetType()来识别基础类。但是我得到IColumnProxy类型,而不是获得正确的类型,这是动态的代理玻璃映射器用于创建视图模型。
有没有办法获取实际类型而不是动态代理? 感谢
编辑:这是代码示例:
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
编辑:更新1
好吧,经过深入研究后,看起来GlassMapper就像我应该的那样做,但由于某些原因它在我的具体情况下不起作用。 我错过了什么?引用?
答案 0 :(得分:0)
嗯,经过几天的深入研究,我可以肯定答案是:不是这种情况。基本上,它应该工作。但在我的情况下,没有办法获得接口的实际实现。 GlassMapper将实际的类替换为&#34; children&#34;中声明的接口的动态代理实现。属性,所以没有办法将每个孩子都投射到他们的实际类型。
这非常糟糕,因为可以防止实施一大堆动态方案。我已经创建了一个自定义映射器来处理这个问题。但正如我之前所写的那样,它只在这个具体案例中起作用。通常它应该工作。