C# 向上转型/多态性问题

C# Upcasting / Polymorphism Issue

我认为这个问题很基础,但我找不到这个问题的答案。在 C# 中,假设我有 3 个 classes:A, B, C

B 派生自 A

C 派生自 B

现在,如果我想要一个 class A 类型对象的列表或数组,但希望该数组能够容纳 B 和 C 类型的对象,这没问题...我可以做一些事情像这样:

A[] myArrayofAtypes;

但是假设我将此数组的第一个元素设为 C 类型。如果类型 C 在其 class 定义中定义了一个变量,该变量仅存在于 class C 的 class 中定义...如何从数组中访问该变量?我不能只做 A[0].MyVariableGetter,因为基数 class、A.

中不存在该变量

有什么建议吗?

你必须向下转换它:

C c = (C)myArrayofAtypes[0];
var v = c.MyVariableGetter;

您必须将其强制转换为类型 c 并访问该成员。

If (arr[i] is c)
{
    ((C)arr[0]).member = value;
 }

我会使用这些漂亮的 C# 运算符,而不是像 'king.code' 建议的那样进行转换,它们是 'is' 和 'as'.

public void CallIfTypeC(A a)
{
    if (a is C)
    {
        C c = a as C;
        c.DoAction();
    }
}