Nhibernate 流畅的纤维酸多态性。如何检查类的类型

Nhibernate 流畅的纤维酸多态性。如何检查类的类型,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,我有一个具有内容(一对一)关系的图标 public class Icon { public virtual Content Content {get; set;} } 默认情况下,它是延迟加载的,这正是我想要的。 然而,在代码中的某个点上,我需要检查什么类型的内容,内容是多态的,比如 if(icon.Content is TextContent) { ... } 图标是另一个关联的一部分,由NHibernate自动获取,我不手动获取 在这种情况下,检查实际类型的推荐方法是什么 我可以

我有一个具有内容(一对一)关系的图标

public class Icon
{
   public virtual Content Content {get; set;}
}
默认情况下,它是延迟加载的,这正是我想要的。 然而,在代码中的某个点上,我需要检查什么类型的内容,内容是多态的,比如

if(icon.Content is TextContent)
{
 ...
}
图标是另一个关联的一部分,由NHibernate自动获取,我不手动获取

在这种情况下,检查实际类型的推荐方法是什么


我可以有一个特定的属性,如ContentType,它将是一个枚举,以便识别实际的内容类型,但我想知道是否有其他方法。

如果要进行此类检查,必须从属性中删除代理。 有几种方法可以做到这一点:

  • 如果您有权访问会话呼叫:

    session.PersistenceContext.Unproxy(icon.Content);
    
  • 实现一个虚拟方法(如果可能,在基类中),该方法通过返回具有适当类型的实例来强制删除代理

    public virtual U As<U>() where U : YourType {
        return this as U;
    }
    
    public virtual U As(),其中U:YourType{
    将此作为U返回;
    }
    
  • 禁用属性的延迟初始化

  • 这很类似于

    要添加到csanchez的列表中,第四种方法是向返回未代理类型的内容基类添加
    Self
    属性:

    public virtual void Self
    {
       get { return this; }
    }
    

    第五种方法是在映射中使用'lazy=“no proxy”“。

    谢谢你的建议,但同时我发现了一个有趣的解决方案,我认为更好

    使用访问者模式,我可以定义IconContent访问者并将要执行的操作传递给它。 例如,假设有一个TextContent和一个ImageContent,它将是这样的:

    IconContentVisitor.Func(()=> {  Console.WriteLine("this is TextContent"; }, ()=> { Console.WriteLine("this is ImageContent"));
    
    这个想法来自这里: