Плавный полиморфизм ниберната. как проверить тип класса

У меня есть значок, который имеет отношение контента (один к одному).

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

По умолчанию это лениво загружено, что я и хочу. Тем не менее, в какой-то момент в коде мне нужно проверить, что это за Контент, Контент полиморфный, что-то вроде

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

Значок является частью другой ассоциации, и он автоматически получен NHibernate, я не получаю его вручную.

Каков рекомендуемый способ проверки фактического типа в этой ситуации?

У меня может быть определенное свойство, например ContentType, которое будет перечислением для определения фактического типа контента, но я хочу знать, есть ли другой способ.

3 ответа

Решение

Спасибо за предложения, но тем временем я нашел интересное решение, я думаю, что лучше.

Используя шаблон Visitor, я могу определить посетителя IconContent и передать ему действие, которое будет выполнено. Например, предположим, что есть TextContent и ImageContent, это будет что-то вроде этого:

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

Идея пришла отсюда: http://mookid.dk/oncode/archives/991

Это очень похоже на другой недавний вопрос.

Чтобы добавить в список csanchez, четвертый метод состоит в том, чтобы добавить Self свойство базового класса Content, которое возвращает непроксифицированный тип:

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

И пятый метод - использовать 'lazy="no-proxy"`в отображении, как описано в блоге Айенде.

Если вы хотите сделать такую ​​проверку, вы должны удалить прокси из свойства. Есть несколько способов сделать это:

  1. Если у вас есть доступ к сеансу вызова:

    session.PersistenceContext.Unproxy(icon.Content);
    
  2. Реализуйте виртуальный метод (если возможно, в базовом классе), который принудительно удаляет прокси, возвращая экземпляр с правильным типом.

    public virtual U As<U>() where U : YourType {
        return this as U;
    }
    
  3. Отключите ленивую инициализацию свойства.

Другие вопросы по тегам