0

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

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

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

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

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

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

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

4

3 回答 3

0

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

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

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

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

于 2012-11-24T17:01:34.517 回答
0

这与最近的另一个问题非常相似。

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

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

第五个方法是在映射中使用 'lazy="no-proxy"`,如 Ayende 的博客中所述

于 2012-11-21T15:51:42.890 回答
0

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

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

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

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

于 2012-11-21T13:19:13.020 回答