У меня довольно много проблем, возможно, недоразумений с ключевым словом new
со свойствами в производных классах. Большая часть документации касается new
для производных методов. Например:
[DataContract]
[KnownType(typeof(PostCategory))]
public class BaseCategory : IEquatable<BaseCategory>
{
//...
/// <summary>
/// Enables access to child categories (immediate ones). Filled in by data access provider. Not serializable.
/// </summary>
public SortedDictionary<string, BaseCategory> Children { get; set; }
//...
}
[DataContract]
[KnownType(typeof(BaseCategory))]
public class PostCategory : BaseCategory
{
//...
public new SortedDictionary<string, PostCategory> Children { get; set; }
//...
}
Тогда в моей реализации репозитория данных у меня есть общая реализация для всех классов, которые являются производными от BaseCategory. Я делаю это:
public class CachedXmlCategorizationProvider<T> : ICategorizationRepository<T> where T : BaseCategory, new()
{
private readonly ICacheProvider _cacheProvider = AppServices.Cache;
private readonly string _file = Path.Combine(XmlProvider.DataStorePhysicalPath, typeof (T).Name, "categorization.xml");
private SortedDictionary<string, T> _dictionary;
//...
private SortedDictionary<string, T> LoadFromDatastore()
{
if (!DefaultsExist())
{
return CreateDefaults();
}
var dcs = new DataContractSerializer(typeof (SortedDictionary<string, T>));
XmlDictionaryReader reader =
XmlDictionaryReader.CreateTextReader(new FileStream(_file, FileMode.Open, FileAccess.Read),
new XmlDictionaryReaderQuotas());
_dictionary = (SortedDictionary<string, T>) dcs.ReadObject(reader, true);
/* HERE! Apparently this fills in the Children property of the base class */
// fill in Children
foreach (var pair in _dictionary)
{
pair.Value.Children = GetChildren(pair.Value.Id);
}
reader.Close();
return _dictionary;
}
//...
}
и когда я пытаюсь получить доступ к свойству Children
определенного экземпляра PostCategory
во время выполнения, это null
, а base.Children
устанавливается в правильный словарь для детей, как установлено методом GetChildren()
.
Дело в том, что мой код основан на проверке экземпляра PostCategory.Children, и, поскольку он нулевой, мой код не работает.
Как правильно достичь желаемого (иметь один базовый класс и изменить тип свойства в производном классе)?