我能否在内部类中访问外部类对象?

26

我有三个类似这样的类。

class A
{
    public class innerB
       {
       //Do something
       }

    public class innerC
       {
        //trying to access objB here directly or indirectly over here. 
        //I dont have to create an object of innerB, but to access the object created by A
        //i.e.
             innerB objInnerB = objB;
        //not like this
             innerB objInnerB= new innerB();
       }

private innerB objB{get;set;}  **//Private**

public A()
   {
    objB= new innerB();
   }
}

我想在类C中访问由类A创建的类B的对象。是否有可能在类C中对类A的对象进行更改?可以通过创建事件或其他方式获取类A的对象吗。

编辑:上面提出的问题中我的错误。A类中创建的B对象是私有的,而不是公共的。

是否可以通过创建事件来实现这一点?

如果我能够以某种方式引发一个可以由类A处理的事件,那么我的问题就可以得到解决。


3
既然你写了大部分的代码,为什么不把它倒入 Visual Studio,自己试一下呢? - Justin Niessner
@Justin:谢谢你的帮助,我已经在VS中尝试做这件事了。我只是总结了我目前想要的东西,用了100行代码。如果你有任何解决方案,请建议一下。我需要在我的事件中访问A的对象,该事件由其他类引发,并在innerC中被捕获。 - Shantanu Gupta
1
我向我们的团队这样解释:想象一下,你没有将外部类的实例传递给它。现在想象一下,你的外部类有一个内部类实例的静态字段/属性。现在想象一下,你的内部类访问外部类的字段、属性和方法。它甚至可以访问私有的那些。但是它会访问谁的呢?你可以有 xxx 个外部类的实例,但这并不意味着有相同数量的内部类,只因为它是内部的。所以静态实例只有一个,无法知道外部类在内存中的位置。内部类仍然是一个普通的类。 - That Marc
3个回答

31
如果我理解正确,您想在innerC中访问类A的objB属性,而无需将其传递。这不是C#内部类的工作方式,正如C#嵌套类类似于C++嵌套类,而不是Java内部类所述的那样。如果您想从innerC访问A.objB,则必须以某种方式将类A传递给innerC。

18
因为没有 outer 关键字,所以你需要传递父类参数,但内部类可以访问父类的私有成员。 - dbkk
1
谢谢你的负评。另外,你是错的。 - Andrew Anderson
2
请问C#编译器:示例代码 - dbkk
9
嵌套类型可以访问包含它们的类型的私有和受保护成员,包括任何继承的私有或受保护成员。嵌套类型在外部私有成员的定义范围内,因此可以访问它们。请参阅此MSDN文章 - Dave T.
然而,@AndrewAnderson,你关于将外部传递给内部作为构造函数参数是正确的。 - Dave T.
显示剩余2条评论

12

你需要将OuterClass的引用传递给InnerClass,例如在构造函数中:

public class OuterClass
{
    //OuterClass methods

    public class InnerClass
    {
        private OuterClass _outer;

        public InnerClass(OuterClass outer)
        {
            _outer = outer;
        }
    }
}

那么你就可以在所有的InnerClass方法中使用该引用。


我正在尝试在由某个用户控件引发的事件中进行操作,该用户控件的句柄已在类B中定义,并具有类C对象的集合。 - Shantanu Gupta
你的事件参数是否可以保存你所需要的对象的引用? - dlras2
我不这么认为,因为该事件是由一个用户控件引发的,而该用户控件又被绑定到一个集合上,该集合由包含类C集合的类B持有。我知道目前这有点令人困惑。 - Shantanu Gupta
@Ctclotis:在那里本身引发一个事件并由A类处理,这是否有可能?我可以绑定A中的任何事件。 - Shantanu Gupta
也许最好解释一下你想要做什么,而不仅仅是你如何尝试去做。我有困难理解你为什么要这样做的目的是什么... - dlras2

-1

由于你的 B 类与 C 类在同一个作用域内,即 A 类中,因此你可以从嵌套类型 C 中实例化嵌套类型 B 并使用它。


我认为这不是他想要的 - 如果我理解正确,他想在innerC中访问类A的objB属性,而无需将其传递。 - Andrew Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接