本帖最后由 asker1982 于 2010-04-17 00:16:01 编辑

解决方案 »

  1.   

    而Form类也没定义这个ctlClient 你确定?
      

  2.   

    文档和元数据查不到ctlClient但是运行时显示field确实找到了ctlClient字段.也就是说Form这个Type确实定义了ctlClient(我debug的时候也看见了)
    ...请问为什么这个ctlClient字段不公开,这样写会造成问题么?
    有没有什么介绍这些未公开字段的文档
    谢谢
      

  3.   

        public class MdiClientPanel : Panel
        {
            private Form mdiForm;        public Form MdiForm
            {
                get
                {
                    return this.mdiForm;
                }
            }        private MdiClient ctlClient1;        public MdiClientPanel(Form mdiForm)
            {
                ctlClient1 = new MdiClient();
                base.Controls.Add(this.ctlClient1);
                this.mdiForm = mdiForm;
                System.Reflection.FieldInfo field = typeof(Form).GetField("ctlClient1", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);  
                field.SetValue(this.mdiForm, this.ctlClient1);
            }
        }
    改下就变量名就会发现得到null了,说明Form中恰好有一个ctlClient
      

  4.   

    全在于 System.Reflection.BindingFlags.NonPublic 这个设定.既然非公开的, 需要你知道这样做的后果.除非你知道自己在做什么, 最好不要这样.通过反射机制, 类型层次的访问限定符完全失效, 私有的属性, 函数都可以使用.
      

  5.   


    字段不公开就是没必要让你知道,不需要你修改,也不希望你去修改.它只是暂存一些状态.就像DLL中提供的函数,只告诉你接口是什么样的,传什么类型的参数就可以了,至于函数的内部是怎么实现的就不需要你关心了.
      

  6.   

     private MdiClient ctlClient;
    ----------------------------------
    查看源代码
      

  7.   

    是的,刚才我在www.mycsharp.de/wbb2/thread.php?postid=3589752找到的教程也提到这个字段,
    看来提问之前应该好好先Google一下.....既然如此,我换个问题来问好了,
    有没有什么文档提供一份列表说明这些私有字段用法的,MSDN文档很多东西都找不到啊....元数据不能看私有字段太不方便了
      

  8.   


    恩,谢谢,确实没注意到那个NonPublic