C# Sitecore、GlassMapper、接口和动态代理

C# Sitecore、GlassMapper、接口和动态代理,c#,razor,sitecore,castle-dynamicproxy,glass-mapper,C#,Razor,Sitecore,Castle Dynamicproxy,Glass Mapper,在Sitecore中,我有两个类,代表两个可能的节点,它们可以作为另一个节点的子节点。 我的模型包含一个子属性,它是IEnumerable(两个类都实现INode)。在运行时,我获取每个子对象的基本类型来识别它们并执行一些操作。 在我的测试中,一切都很顺利。但实际的实现并不如此 基本上,在razor视图中(从GlassView继承),我循环遍历INode子对象的集合并调用.GetType()来标识底层类。但是我没有得到正确的类型,而是得到了IColumnProxy类型,这是glass映射器用于创

在Sitecore中,我有两个类,代表两个可能的节点,它们可以作为另一个节点的子节点。 我的模型包含一个子属性,它是IEnumerable(两个类都实现INode)。在运行时,我获取每个子对象的基本类型来识别它们并执行一些操作。 在我的测试中,一切都很顺利。但实际的实现并不如此

基本上,在razor视图中(从GlassView继承),我循环遍历INode子对象的集合并调用.GetType()来标识底层类。但是我没有得到正确的类型,而是得到了IColumnProxy类型,这是glass映射器用于创建视图模型的动态代理

有没有办法获取实际类型而不是动态代理? 谢谢

编辑:下面是代码示例:

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; }
}
项目中的引用是Glass.Mapper和Glass.Mapper.Sc

编辑:更新1

好吧,在深入研究之后,GlassMapper似乎按照我的方式来做,但由于某种原因,它在我的具体案例中不起作用。
我遗漏了什么?引用?

好吧,在深入研究这个问题几天后,我可以肯定答案是:在这种情况下不是。基本上,它应该可以工作。但在我的情况下,没有办法获得接口的实际实现。GlassMapper用在e“children”属性,因此无法将每个子级强制转换为其实际类型


这太糟糕了,因为它阻止了一大堆动态场景的实现。我已经创建了一个自定义映射器来处理这个问题。但正如我之前所写的,它仅在这个特定的情况下不起作用。通常它应该起作用。

你没有调用
GetType()
而尝试
if(node is MyType)
?是的,我做了,但它不起作用,因为接口实现不知何故被代理隐藏了。GlassMapper就是这样做的——它通过Castle Windsor生成自己的接口实现。查看这篇文章:与其检查具体类型,我建议您检查每个对象是否实现了特定的I接口-前提是子项有两个不同的Sitecore模板。我还没有在V4中尝试过,但它肯定在V3中有效,因为我个人使用它的方式与我在前面的评论中提到的完全相同。您是否为玻璃模型使用接口或具体类?同意jammykam。我实现了parent.Children.OfType()。您可以检查child.GetType().BaseType,但这不是必需的。您有这样的示例吗?Thanks@jammykam我使用的是具体的类这里有一个我调试的截图。我绝对不为我工作
@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
}