2

假设您有两种形式:FormA 和 FormB..

在 FormA 中,我有一些属性。FormA 创建 FormB 并设置 owner 属性。例如:

public FormA() 
{
    FormB = new FormB(){Owner = this};
}

现在,在 FormB 中,如果我想访问我在 FormA 上声明的属性。为什么我在写的时候看不到它们:

Owner. // here I need to see FormA properties...

为什么它不能这样工作?

4

3 回答 3

4

尝试这个:

var forma = Owner as FormA;
forma.Stuff = otherstuff;
于 2013-03-14T21:56:44.627 回答
4

由于继承和多态性,您看不到。

.NET 中的表单继承自名为 Form 的基类。你FormA是一个派生自Form的类,FormB也是。

现在,Form 引用了 Owner 表单,

public Form Owner { get; }

您为其分配了 FormA。没问题!派生类可以被视为它们的基类。但是,如果你访问它,你会得到一个表单,所以你需要做的就是新表单转换回你实际提供的表单:

FormA form = (FormB)Owner;

这几乎与执行以下操作相同:

FormA form = Owner as FormB;

但有一些警告。运算符是“as安全转换”,如果对象不是提供的类型,则返回空值。

我会向您推荐我们提供的代码,当您有时间时,学习继承和多态。它们是了解正在发生的事情的关键。

如果我可以做一些自我推销,我会及时写一篇关于为什么你通常会避免as你可能会觉得有趣的文章。

于 2013-03-14T21:59:25.467 回答
3

原因是一个叫做多态的概念。在更具体的意义上,该Owner属性是 type FormFormA继承自 type Form,所以在某种程度上,它是 aForm和 a FormA。解决此问题的方法是将所有者“强制转换”为FormA,如下所示:

FormA fa = Owner as FormA;
if (fa != null)
{
    // do something
}

您要在null此处检查的原因是,也许其他人正在使用您的FormB,并且已将Owner属性设置为 type FormC,您不一定能够控制。在这种情况下,代码Owner as FormA将返回null. 因此,空检查确保您不会得到任何令人讨厌的惊喜。

于 2013-03-14T22:09:42.993 回答