我不知道这是否与FindControl的工作方式或范围的工作方式有关。但是我的基类很难看到子类的字段。目前我正在计划派生类在基类中设置一个属性,但是有很多派生类,所以这不是一个非常有吸引力的解决方案。
public class BasePage:Page
{
public void DoSomethingWithDerivedPageControl()
{
//foo is always null.
Control foo = FindControl("Foo");
}
}
public class DerivedPage : BasePage
{
//In real life, this is the code generated .aspx.designer.cs file.
protected Label Foo;
}
答案 0 :(得分:4)
FindControl
不使用字段 - 它使用已添加到页面的控件,并检查其ID。
据推测,在调用DoSomethingWithDerivedPageControl
时,您的控件尚未添加到页面中。
如果你能告诉我们你真正想要实现的目标会很有帮助...如果所有派生类型都应该有一个名为Foo
的控件,为什么不把它放在基类中来启动与?
答案 1 :(得分:2)
public abstract class BasePage:Page
{
abstract protected Label Foo {get;}
public void DoSomethingWithDerivedPageControl()
{
Control foo = this.Foo;
}
}
public class DerivedPage : BasePage
{
override protected Label Foo { get; set;}
}
现在,我怀疑这并不能满足你的需求。但是,基类不能/不能知道它的孩子。您在子类中查找随机字段的唯一选择是忽略它们是基础/派生的事实,并且只使用它的反射,就好像它是一个不相关的类。
答案 2 :(得分:1)
要回答标题问题,继承从基类运行到派生类,而不是其他方式。成员要么在基类中定义,要么由派生类继承,要么在派生类中定义,并且对于基类是未知的。
理所当然,引用子成员的基类无法编译,因为基类定义不了解该成员。
答案 3 :(得分:0)
哇,你甚至试图这样做是可怕的。基类不应该知道派生类的任何信息。