У меня есть ситуация, когда мне нужно определить, является ли унаследованный класс конкретным унаследованным классом, но тип, ожидаемый в модели, является базовым классом, и он сохраняется с использованием nHibernate
/ Fluent nHibernate
с использованиемTable Per Concrete Class
Иерархия.Так что моя структура выглядит примерно так ...
class Mutation : Entity {
virtual Aspect Aspect { get; set; }
virtual Measurement Measurement { get; set; }
}
abstract class Measurement : Entity {
// does nothing on its own, really.
}
class Numeric : Measurement {
virtual int Value { get; set; }
// may have some other properties
}
class Observable : Measurement {
virtual Aspect Aspect { get; set; }
}
Итак, вот что здесь происходит.Mutation
предполагает указание на тип данных и измеренное изменение (могут быть другие способы изменения данных, а не только плоские числа).И тогда у меня будет объект, который просто ожидает IList<Mutation>
и сопоставит каждый последующий тип Measurement
с его собственной конкретной таблицей, разделяющей Identity
с базовым классом Measurement
.Пока это прекрасно работает.
Теперь Observable
отличается тем, что он не хранит свое собственное значение, а скорее снова указывает на другой Aspect
, который может иметь свой собственный набор мутаций и изменений.Идея состоит в том, что значение всегда будет извлекаться из предполагаемого источника, а не сохраняться как плоское значение в базе данных.(Есть причина желать такого поведения, которое выходит за рамки этого вопроса)
Итак, моя мысль заключалась в том, чтобы поставить такую оценку, как эта ..
foreach(var measurement in list) {
if(measurement is Observable){
// then we know to lookup the other value
}
}
Этоне работалЯ все еще получаю результат прокси всего MeasurementProxy
.Но тот же код прекрасно работает в автономном C#
приложении без использования nHibernate, поэтому я чувствую большую уверенность в том, что проблема связана с прокси.
Затем я добавил следующий метод в свою базуEntity
класс ...
/// <summary>
/// Unwrap the type from whatever proxy it may be
/// behind, returning the actual .NET <typeparamref name="System.Type"/>.
/// </summary>
/// <returns>
/// A pure <typeparamref name="System.Type"/> that is no longer proxied.
/// </returns>
public virtual Type Unwrap() {
return GetType();
}
Теперь, если я делаю Console.WriteLine(measurement.Unwrap());
, я получаю правильный тип, но та же оценка ...
foreach(var measurement in list) {
if(measurement.Unwrap() is Observable){
// then we know to lookup the other value
}
}
все еще не работает,Это никогда не работает.Может ли кто-нибудь помочь мне здесь?