gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:19:01 25 4
gpt4 key购买 nike

选择的解决方案

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

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

关于c# - 将通用集合转换为C#2.0中的具体实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1709878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com