gpt4 book ai didi

c# - 将基类列表转换为派生类列表 - 可能吗?

转载 作者:行者123 更新时间:2023-11-30 13:18:47 26 4
gpt4 key购买 nike

我的同事告诉我可以转换 List<BaseClass>List<DerivedClass> (他们没有向我展示一个有效的例子)。我不认为可以将父类转换为子类(但我知道可以反过来做)。我已经看到几个相关的问题,有人说无法完成,有人说可以 - 没有一个提议的解决方案对我有用。我总是得到:

System.InvalidCastException.
Unable to cast object of type 'BaseClass' to 'ChildClass'

这绝对可能吗?如果是这样,我做错了什么?这是我的代码(针对这个问题进行了简化):

父类:

public class ParentClass
{
public string Name = "";
}

子类:

public class ChildClass: ParentClass
{
public string Date = "";
}

转换:

List<ParentClass> parentList = ServiceApi.GetParentClassList().ToList();
List<ChildClass> childList = parentList.Cast<ChildClass>().ToList();

我的实际代码要复杂得多,但应该适用相同的原则。

最佳答案

从某种意义上说,你们都是对的。

假设您有类型 Animal , Cat (继承 Animal)和 Dog (继承动物)。 List<Animal>可以同时包含猫和狗,但是 List<Dog>不能包含猫。如果你有 List<Animal>包含 Cat 和 Dog 对象,你做任何事情都不会让你产生 List<Dog>包含原始列表中的所有内容。

所以从这个意义上说,您不能生成 List<DerivedClass> 是对的来自 List<ParentClass> .

但是,作为程序员,有时您会获得编译器无法获得的有关如何使用对象的信息。如果(且仅当)你可以知道一个特定的 List<Animal>实例仅包含 Dog对象,你总是可以这样写:

List<Dog> dogList = myAnimalListWithOnlyDogs.Cast<Dog>().ToList();

再说一次:这仅在您可以保证列表实例中的每个对象都可转换为 Dog 对象时才有效。如果 Cat 对象以某种方式工作,它就进入了您的列表,您将在运行时遇到异常。尽管如此,这样的代码并不少见。

从这个意义上说,这位同事是对的。当涉及到真正的工作代码时,人们无论如何都会这样做并产生很大的效果,而且还可以侥幸逃脱,尽管纯粹主义者可能会争辩说这是一种代码味道,表明需要使用组合而不是继承。

此外,有时可能会出现 List<Animal>实例包含 Cat 和 Dog 对象,您只关心 Dog对象。在这种情况下,您可以这样做:

List<Dog> dogList = myAnimalList.OfType<Dog>().ToList();

我经常看到这种模式,尤其是在使用 WinForms 控件集时。

在上面的两个示例中,您都在使用新序列。在新序列中添加或删除对象不会更改原始序列。从这个意义上说,您没有转换原始文件,而是创建了一个替换文件。但是,该序列包含相同的对象,因此在新序列中编辑 Dog 对象的属性更改原始对象中的该对象,因为它是相同的对象实例。

关于c# - 将基类列表转换为派生类列表 - 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44660403/

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