Плавный полиморфизм ниберната. как проверить тип класса
У меня есть значок, который имеет отношение контента (один к одному).
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"`в отображении, как описано в блоге Айенде.
Если вы хотите сделать такую проверку, вы должны удалить прокси из свойства. Есть несколько способов сделать это:
Если у вас есть доступ к сеансу вызова:
session.PersistenceContext.Unproxy(icon.Content);
Реализуйте виртуальный метод (если возможно, в базовом классе), который принудительно удаляет прокси, возвращая экземпляр с правильным типом.
public virtual U As<U>() where U : YourType { return this as U; }
Отключите ленивую инициализацию свойства.