假设您有两种形式:FormA和FormB ..
在FormA中,我有一些属性。 FormA创建FormB并设置所有者属性。例如:
public FormA()
{
FormB = new FormB(){Owner = this};
}
现在,在FormB中,如果我想访问我在FormA上声明的属性。 为什么我在写作时看不到它们:
Owner. // here I need to see FormA properties...
为什么它不能像这样工作?
答案 0 :(得分:4)
试试这个:
var forma = Owner as FormA;
forma.Stuff = otherstuff;
答案 1 :(得分:4)
由于继承和多态性,你无法看到。
.NET中的表单继承自名为Form的基类。 FormA是一个派生自Form的类,FormB也是如此。
现在,Form有一个对所有者表单的引用,
public Form Owner { get; }
您已为其分配了FormA。没问题!派生类可以视为其基类。但是,如果您访问它,则会返回一个表单,因此您需要做的是将新表单转换回您实际提供的表单:
FormA form = (FormB)Owner;
这几乎与:
相同FormA form = Owner as FormB;
但有一些警告。 as
运算符是“安全转换”,如果对象不是提供的类型,则返回空值。
我建议您只使用我们提供的代码,并在您有时间时研究继承和多态性。它们是了解正在发生的事情的关键。
如果我可以进行一些自我推销,我wrote a piece了解为什么你一般会避免as
及时发现你感兴趣的内容。
答案 2 :(得分:3)
原因是一个名为polymorphism的概念。在更具体的意义上,Owner
属性的类型为Form
。 FormA
继承自Form
类型,因此在某种程度上,它是Form
以及FormA
。解决这个问题的方法是将所有者“强制转换”为FormA
,如下所示:
FormA fa = Owner as FormA;
if (fa != null)
{
// do something
}
您要在此处检查null
的原因是,其他人可能正在使用您的FormB
,并且已将Owner
属性设置为FormC
类型,你不一定能够控制的。在这种情况下,代码Owner as FormA
将返回null
。因此,空检查确保您不会有任何令人讨厌的意外。