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
嵌套类型可访问包含类型的私有成员和受保护的成员(包括所有继承的保护的成员)。