1、案例出错现场“无法通过嵌套类型访问外部类型的非静态成员”
2、源文件代码分析
点击(此处)折叠或打开
- 基本类文件结构如下:
- xxxxx.cs
- using ……;
- namespace AAA
- {
- ……
- public partial class BBB
- {
- public void CWaitForGetPresetOver()
- {
- //////
- }
- public setProgressBar()
- {
- //////////
- }
- ////////////////////////////////////////////////////////////////////////////////////////
- // CWaitForGetPresetOver类结构
- public class CWaitForGetPresetOver
- {
- public CWaitForGetPresetOver()
- {
- //////////////
- }
- public void WaitForGetPresetOver()
- {
- setProgressBar();
- }
- }
- /////////////////////////////////////////////////////////////////////////////////////////
- // BBB中某些函数对CWaitForGetPresetOver的调用
- ...........
- CWaitForGetPresetOver CWForGetPresetOver_demo = new CWaitForGetPresetOver();
- CWForGetPresetOver_demo.CWaitForGetPresetOver();
- ...........
- }
- }
上面CS文件的基本结构是:
外部类型 BBB,
BBB有一个公有方法,setProgressBar();
BBB里面有一个内部类型CWaitForGetPresetOver;
上面代码,当执行到CWForGetPresetOver_demo.CWaitForGetPresetOver();的时候就会爆出1中的错误。
3、解决方法
主要是修改嵌套类型,在其构造函数中将外部类型传进去;再在嵌套类型内部通过外部类型对象进行操作其成员函数!
代码修改如下:
点击(此处)折叠或打开
- // 嵌套类型构造函数
- public class CWaitForGetPresetOver
- {
- BBB BBB_demo;
- // 嵌套类型构造函数中传入外部类型
- public CWaitForGetPresetOver(BBB BBB_demo)
- {
- this.BBB BBB_demo = BBB BBB_demo;
- }
- public void WaitForGetPresetOver()
- {
- //通过传进来外部类型,调用其对象成员
- BBB_demo.setProgressBar();
- }
- }
4、参考文献
Msdn上说:
嵌套类型(或内部类型)可访问包含类型(或外部类型)。若要访问包含类型,请将其作为构造函数传递给嵌套类型。例如:
-
点击(此处)折叠或打开
- C# code
- public class Container
- {
- public class Nested
- {
- private Container m_parent;
- public Nested()
- {
- }
- public Nested(Container parent)
- {
- m_parent = parent;
- }
- }
- }
- C# code
据此,你的代码更改如下:
- C# code
-
点击(此处)折叠或打开
- public class checkFlowThread
- {
- Form1 form1;
- public checkFlowThread(Form1 f)
- {
- this.form1=f;
- }
- public void checkFlow()
- {
- form1.Label.Text = "想访问外部类的非静态成员";
- }
- }
- public class checkFlowThread
嵌套类型可访问包含类型的私有成员和受保护的成员(包括所有继承的保护的成员)。