流利的nhibernate多态性。如何检查类的类型

时间:2012-11-21 01:16:37

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

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

public class Icon
{
   public virtual Content Content {get; set;}
}

默认情况下,它是延迟加载的,这就是我想要的。 但是,在代码中的某个时刻,我需要检查内容是什么类型,内容是多态的,类似

if(icon.Content is TextContent)
{
 ...
}

Icon是另一个关联的一部分,它是由NHibernate自动获取的,我不是手动获取的。

在这种情况下,建议检查实际类型的方法是什么?

我可以拥有一个像ContentType这样的特定属性,它将是一个枚举,以便识别实际的内容类型,但我想知道是否有不同的方式。

3 个答案:

答案 0 :(得分:0)

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

  1. 如果您有权访问会话:

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

    public virtual U As<U>() where U : YourType {
        return this as U;
    }
    
  3. 禁用属性的延迟初始化。

答案 1 :(得分:0)

这与another recent question非常相似。

要添加到csanchez的列表,第四种方法是将一个Self属性添加到返回未代理类型的Content基类:

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

第五种方法是在映射as described on Ayende's blog中使用'lazy =“no-proxy”。

答案 2 :(得分:0)

感谢您的建议,但同时我找到了一个有趣的解决方案,我认为更好。

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

IconContentVisitor.Func(()=> {  Console.WriteLine("this is TextContent"; }, ()=> { Console.WriteLine("this is ImageContent"));

想法来自这里:http://mookid.dk/oncode/archives/991