[求助]问个反射的问题(用GetField取到了"不该存在"的字段) 本帖最后由 asker1982 于 2010-04-17 00:16:01 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 而Form类也没定义这个ctlClient 你确定? 文档和元数据查不到ctlClient但是运行时显示field确实找到了ctlClient字段.也就是说Form这个Type确实定义了ctlClient(我debug的时候也看见了)...请问为什么这个ctlClient字段不公开,这样写会造成问题么?有没有什么介绍这些未公开字段的文档谢谢 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 全在于 System.Reflection.BindingFlags.NonPublic 这个设定.既然非公开的, 需要你知道这样做的后果.除非你知道自己在做什么, 最好不要这样.通过反射机制, 类型层次的访问限定符完全失效, 私有的属性, 函数都可以使用. 字段不公开就是没必要让你知道,不需要你修改,也不希望你去修改.它只是暂存一些状态.就像DLL中提供的函数,只告诉你接口是什么样的,传什么类型的参数就可以了,至于函数的内部是怎么实现的就不需要你关心了. private MdiClient ctlClient;----------------------------------查看源代码 是的,刚才我在www.mycsharp.de/wbb2/thread.php?postid=3589752找到的教程也提到这个字段,看来提问之前应该好好先Google一下.....既然如此,我换个问题来问好了,有没有什么文档提供一份列表说明这些私有字段用法的,MSDN文档很多东西都找不到啊....元数据不能看私有字段太不方便了 恩,谢谢,确实没注意到那个NonPublic #求一个数字编号的筛选算法,高手请进,不限语言# C#中判断switch是不是不能用char定义的 C#中如何关掉Excel进程? 关于DataSet统计问题 高手进~~ 有关dataSet写出xml的问题--很奇怪!(高分求助) 两个应用程序之间的通讯,请教 各位新年好,有个问题,关于XML的,帮我看下,谢了 请教高手:如何把XmlSchema文件转化到TreeView中显示? 关于显示效果的问题 list倒序不起作用 [急]像QQ这样的好友头像是转换成ICO才能在托盘中闪烁的吧? 如何获取其他程序窗体中Label的内容
...请问为什么这个ctlClient字段不公开,这样写会造成问题么?
有没有什么介绍这些未公开字段的文档
谢谢
{
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
字段不公开就是没必要让你知道,不需要你修改,也不希望你去修改.它只是暂存一些状态.就像DLL中提供的函数,只告诉你接口是什么样的,传什么类型的参数就可以了,至于函数的内部是怎么实现的就不需要你关心了.
----------------------------------
查看源代码
看来提问之前应该好好先Google一下.....既然如此,我换个问题来问好了,
有没有什么文档提供一份列表说明这些私有字段用法的,MSDN文档很多东西都找不到啊....元数据不能看私有字段太不方便了
恩,谢谢,确实没注意到那个NonPublic