昨日同事用 VB.net 2002 写了一段反射的代码,结果怎么都无法在运行时获得成员变量!我看过,觉得代码应该没问题,便用 C#(VS.net 2003) 重写,结果成功。附C#代码如下:
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
public Form1()
{
// Windows 窗体设计器支持所必需的
InitializeComponent();
}
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
// set properties value...
}
private void Form1_Click(object sender, System.EventArgs e)
{
System.Reflection.FieldInfo field = this.GetType().GetField("button1", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
System.Windows.Forms.Control ctl = (Control)field.GetValue(this);
MessageBox.Show(ctl.Text + System.Environment.NewLine + ctl.Name);
}
}
那么为什么在C#中可以,而在VB.net中却始终无法获得 "button1" 的 System.Reflection.FieldInfo 对象呢?
使用 this.GetType().GetFields()【VB.net 中为 Me.GetType().GetFields()】枚举所有成员字段,结果发现原本为 "button1" 的控件名变成了 "_button1" 了!!!怎么会多出一个前缀的下划线???!!!是不是VB.net编译器搞的鬼?!唉,把 Form1_Click 事件处理函数中的第一行代码中的 "button1" 改为 "_button1" 后,成功!