Если я правильно понимаю ваш вопрос, вам нужно трактовать IList<LetterSmallA>
как IList<LetterA>
.Это невозможно в C # и по очень веским причинам: одна из вещей, с которыми IList<LetterA>
говорит, что это можно сделать, это «попытаться добавить к ней LetterA
.Это невозможно с IList<LetterSmallA>
, и поэтому нет встроенного способа сделать то, что вы хотите.
Что вы можете сделать, это создать собственную реализацию IList<T>
, которая обернет другую IList<T>
производный тип:
class BaseTypeList<TBase, TDerived> : IList<TBase>
where TBase : class
where TDerived : class, TBase
{
private readonly IList<TDerived> m_derivedList;
public BaseTypeList(IList<TDerived> derivedList)
{
m_derivedList = derivedList;
}
public IEnumerator<TBase> GetEnumerator()
{
return m_derivedList.Cast<TBase>().GetEnumerator();
}
public void Add(TBase item)
{
var derivedItem = item as TDerived;
if (derivedItem == null)
throw new ArgumentException();
m_derivedList.Add(derivedItem);
}
public void Clear()
{
m_derivedList.Clear();
}
// other members implemented in a similar fashion
}
(ограничения class
необязательны, но упрощают код.)
Ваш установщик для ALetters
может выглядеть следующим образом:
_aLetters = value;
if(_aLetters == null)
base.ALetters = null;
else
base.ALetters = new BaseTypeList<LetterA, LetterSmallA>(value);