我有一个内容(一对一)关系的图标。
public class Icon
{
public virtual Content Content {get; set;}
}
默认情况下,它是延迟加载的,这就是我想要的。 但是,在代码中的某个时刻,我需要检查内容是什么类型,内容是多态的,类似
if(icon.Content is TextContent)
{
...
}
Icon是另一个关联的一部分,它是由NHibernate自动获取的,我不是手动获取的。
在这种情况下,建议检查实际类型的方法是什么?
我可以拥有一个像ContentType这样的特定属性,它将是一个枚举,以便识别实际的内容类型,但我想知道是否有不同的方式。
答案 0 :(得分:0)
如果要进行此类检查,则必须从属性中删除代理。 有几种方法可以做到:
如果您有权访问会话:
session.PersistenceContext.Unproxy(icon.Content);
实现虚拟方法(如果可能,在基类中),通过返回具有正确类型的实例来强制删除代理。
public virtual U As<U>() where U : YourType {
return this as U;
}
禁用属性的延迟初始化。
答案 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"));