Выбранный раствор
Спасибо за помощь всем. Я решил сделать следующее.
public static class PersonCollection
{
public static List<string> GetNames(RecordCollection<Person> list)
{
List<string> nameList = new List<string>(list.Count);
foreach (Person p in list)
{
nameList.Add(p.Name);
}
return nameList;
}
}
Я пытаюсь привести обобщенную коллекцию RecordCollection к производной коллекции PersonCollection, но получаю исключение приведения:
RecordCollection<Person> col = this.GetRecords<Person>(this.cbPeople);
PersonCollection people = (PersonCollection)col;
Причина, по которой я пытаюсь это сделать, двояка:
- Производные классы (например, PersonCollection) могут иметь методы экземпляра (например, GetLastNames), которых не должно быть в базовом классе.
- Метод GetRecords является общим, поэтому я могу получить коллекцию любых объектов Record.
Как лучше всего решить эту проблему в C # 2.0 ? Какой самый элегантный подход к решению этой проблемы?
Это подпись GetRecords:
public RecordCollection<T> GetRecords<T>(ComboBox cb) where T : Record, new()
Это моя базовая реализация:
public abstract class Record : IComparable
{
public abstract int CompareTo(object other);
}
public class RecordCollection<T> : ICollection<T> where T : Record, new()
{
private readonly List<T> list;
public RecordCollection()
{
this.list = new List<T>();
}
// Remaining ICollection interface here
}
Я получил производные объекты на основе этой базовой реализации следующим образом:
public class Person : Record
{
public Person()
{
// This is intentionally empty
}
public string Name
{
get;
set;
}
public override int CompareTo(object other)
{
Person real = other as Person;
return this.Name.CompareTo(real.Name);
}
}
public class PersonCollection : RecordCollection<Person>
{
}