.net 无法通过嵌套类型访问外部类型的非静态成员-解决方案

简介: 1、案例出错现场“无法通过嵌套类型访问外部类型的非静态成员”     2、源文件代码分析 点击(此处)折叠或打开 基本类文件结构如下: xxxxx.

1、案例出错现场“无法通过嵌套类型访问外部类型的非静态成员”


image_thumb17 image_thumb18 image_thumb19


 

2、源文件代码分析


点击(此处)折叠或打开

  1. 基本类文件结构如下:

  2. xxxxx.cs

  3. using ……;

  4. namespace AAA

  5. {

  6. ……

  7. public partial class BBB

  8. {

  9.       public void CWaitForGetPresetOver()

  10. {

  11. //////

  12. }

  13. public setProgressBar()

  14. {

  15. //////////

  16. }


  17. ////////////////////////////////////////////////////////////////////////////////////////

  18. // CWaitForGetPresetOver类结构

  19. public class CWaitForGetPresetOver
  20. {

  21. public CWaitForGetPresetOver()

  22. {

  23. //////////////

  24. }

  25. public void WaitForGetPresetOver()

  26. {
  27. setProgressBar();

  28. }

  29. }

  30. /////////////////////////////////////////////////////////////////////////////////////////

  31. // BBB中某些函数对CWaitForGetPresetOver的调用
  32. ...........

  33. CWaitForGetPresetOver CWForGetPresetOver_demo = new CWaitForGetPresetOver();
  34. CWForGetPresetOver_demo.CWaitForGetPresetOver();
  35. ...........

  36. }

  37. }

上面CS文件的基本结构是:

外部类型 BBB,

BBB有一个公有方法,setProgressBar();

BBB里面有一个内部类型CWaitForGetPresetOver;

上面代码,当执行到CWForGetPresetOver_demo.CWaitForGetPresetOver();的时候就会爆出1中的错误。

 

3、解决方法


主要是修改嵌套类型,在其构造函数中将外部类型传进去;再在嵌套类型内部通过外部类型对象进行操作其成员函数!

代码修改如下:

点击(此处)折叠或打开

  1. //  嵌套类型构造函数
  2. public class CWaitForGetPresetOver
  3. {

  4. BBB BBB_demo;



  5. // 嵌套类型构造函数中传入外部类型

  6. public CWaitForGetPresetOver(BBB BBB_demo)

  7. {

  8. this.BBB BBB_demo = BBB BBB_demo;

  9. }



  10. public void WaitForGetPresetOver()

  11. {

  12. //通过传进来外部类型,调用其对象成员

  13. BBB_demo.setProgressBar();

  14. }


4、参考文献

Msdn上说:
嵌套类型(或内部类型)可访问包含类型(或外部类型)。若要访问包含类型,请将其作为构造函数传递给嵌套类型。例如:

 
  


点击(此处)折叠或打开

  1. C# code
  2. public class Container
  3. {
  4.     public class Nested
  5.     {
  6.         private Container m_parent;

  7.         public Nested()
  8.         {
  9.         }
  10.         public Nested(Container parent)
  11.         {
  12.             m_parent = parent;
  13.         }
  14.     }
  15. }

据此,你的代码更改如下:
C# code
 
  


点击(此处)折叠或打开

  1. public class checkFlowThread
  2.         {
  3.             Form1 form1;
  4.             public checkFlowThread(Form1 f)
  5.             {
  6.                this.form1=f;
  7.             }
  8.             public void checkFlow()
  9.             {
  10.             form1.Label.Text = "想访问外部类的非静态成员";
  11.             }
  12.         }

嵌套类型可访问包含类型的私有成员和受保护的成员(包括所有继承的保护的成员)。 

相关文章
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
151 3
|
2月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
44 2
|
2月前
|
监控 网络安全 调度
Quartz.Net整合NetCore3.1,部署到IIS服务器上后台定时Job不被调度的解决方案
解决Quartz.NET在.NET Core 3.1应用中部署到IIS服务器上不被调度的问题,通常需要综合考虑应用配置、IIS设置、日志分析等多个方面。采用上述策略,结合细致的测试和监控,可以有效地提高定时任务的稳定性和可靠性。在实施任何更改后,务必进行充分的测试,以验证问题是否得到解决,并监控生产环境的表现,确保长期稳定性。
90 1
|
3月前
|
存储 安全 物联网
.NET 跨平台工业物联网网关解决方案
【9月更文挑战第28天】本文介绍了利用 .NET 构建跨平台工业物联网网关的解决方案。通过 .NET Core 和多种通信协议(如 MQTT 和 Modbus),实现工业设备的高效接入和数据采集。系统架构包括设备接入层、数据处理层、通信层、应用层和数据库层,确保数据的准确采集、实时处理和安全传输。此外,还详细阐述了设备身份认证、数据加密及安全审计等机制,确保系统的安全性。该方案适用于不同操作系统和工业环境,具备高度灵活性和扩展性。
|
3月前
|
SQL 存储 关系型数据库
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
337 6
|
4月前
|
算法 Java 测试技术
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
|
4月前
|
API
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
|
4月前
|
API C#
.NET电子邮件高效处理解决方案
.NET电子邮件高效处理解决方案
|
4月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
133 7
|
5月前
|
开发框架 前端开发 JavaScript
基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用