选择的解决方案
感谢大家的帮助。我决定做以下事情。
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>
{
}
请您参考如下方法:
您的方法不起作用,因为强制转换不会将一个类的实例转换为另一类的实例。
您没有提供GetRecords <>方法的代码,但大概是GetRecords返回RecordCollection,而不是PersonCollection(它在代码中的某个地方有新的RecordCollection,不是吗?)。
除非此特定实例实际上是PersonCollection,否则无法将RecordCollection强制转换为PersonCollection。可能是因为它没有这些其他方法。
就像
SomeClass obj=new SomeClass();
DerivedClass o=(DerivedClass)obj; //throws exception
