gpt4 book ai didi

c# - 如何通过继承向类添加属性,然后将基类转换为新类?

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

我想知道是否有办法在 C# 中实现这种继承情况:

public class Item
{
public string Name { get; set; }
}

public class ItemExtended : Item
{
public int ExtendedProp { get; set; }
}

假设我有一个返回Item 类型对象的方法:

public Item[] GetItems();

我怎样才能使这样的代码运行?

ItemExtended[] itemsExt = GetItems().Cast(i => (ExtendedItem)i).ToArray();

在转换不会失败的情况下,Name 属性值将被保留,我将拥有一个我可以访问的附加属性 ExtendedProp

编辑(希望能消除一些困惑)

在这种情况下,GetItems 方法只会返回类型为 Item 的项目。我想知道是否有一种转换方法可以将基类型转换为继承类型,从而保留所有基成员值(不使用克隆)。

最佳答案

如果对象的运行时类型是 Item,则不能将其转换为 ItemExtended -- 除非有 user-defined conversion可以从 Item 创建一个 ItemExtended。但是请注意,即使那样,您也将创建一个新的 ItemExtended 实例。

一般情况下,继承不是这样工作的。在托管语言中,只有当对象的运行时类型已经是派生类型时,向下转型才有效。派生类的实例继承了其祖先类的所有数据和行为,但有一个祖先对派生类一无所知。考虑一个示例,其中派生类引入了一个新字段。首先,基类实例较小,因此至少,类型转换需要分配新内存。其次,您必须决定是更改原始实例的运行时类型(这确实很奇怪)还是复制旧数据。后一种方式与用户定义的转换场景非常相似,除了显式调用用户定义的转换,IMO 更好。

在非托管语言中,您当然可以进行任何您想要的任意转换——但如果您做错了,那只会导致灾难性的失败。在上面的示例中,您将尝试访问新字段,但由于尚未为实例分配它,因此您将超出对象内存空间的边界并访问......无论那里有什么,只要有意义还是不是。

如果您想为现有类引入新行为,C# 方法是通过 extension methods .扩展属性还不存在,而且可能永远不会存在,因此您不了解属性语法。您可能会或可能无法忍受。

您可能还会发现它很有趣,即在 XAML 中,概念attached properties有点适合您正在尝试做的事情:您可以为任何东西定义任意新属性——但是如果您查看实现,您真正在做的是创建一个将对象映射到其关联属性值的字典,以及 XAML 编译器通过使标记看起来像您已将属性添加到这些对象来美化这一点。

关于c# - 如何通过继承向类添加属性,然后将基类转换为新类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26078251/

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