2010-08-11 122 views
0

我不知道这是否与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; 
} 

回答

4

FindControl不使用领域 - 它使用已添加到页面的控件,并检查它们的ID。

假设您的控件在调用DoSomethingWithDerivedPageControl时未添加到页面中。

如果你能告诉我们你真的想达到什么会有帮助......如果你所有的派生类型都应该有一个名为Foo的控件,为什么不把它放在基类中呢?

+0

啊!你让我走在正确的轨道上。它在Table控件的控件集合中。我不得不做一个递归搜索来找到它。无法将其移动到基类,因为它是嵌入在每个页面上略有不同表格中的标签。 – MatthewMartin 2010-08-11 18:47:31

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;} 
} 

现在,我怀疑那不是满足你的需要。但是,一个基类不能/不知道它的孩子。你唯一的选择是在子类中找到一个随机字段,只是忽略它们是基础/派生的事实,只是使用它的反射,就好像它是一个不相关的类。

+0

@Miochael Meadows:你知道......当我写这个抽象属性时,我对自己说:“我得记得让课堂抽象......” – 2010-08-11 18:38:41

+0

优雅的解决方案,太糟糕了我没有足够的控制了解Visual Studio代码如何生成.aspx.designer.cs文件 - 我无法将重写添加到声明中。 (或者在那里?) – MatthewMartin 2010-08-11 18:49:58

1

要回答您的标题问题,继承运行从基类到派生类,而不是其他方式。成员可以在基类中定义,并由派生类继承,也可以在派生类中定义并且基类未知。

由于基类定义不知道该成员,所以引用子成员的基类无法编译,这是理所当然的。

0

哇,这是可怕的,你甚至试图做到这一点。基类不应该知道派生类的任何内容。

相关问题