Skip to main content
 首页 » 编程设计

c#之将通用集合转换为C#2.0中的具体实现

2024年01月22日32softidea

选择的解决方案

感谢大家的帮助。我决定做以下事情。

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