现在的位置: 首页 > 综合 > 正文

VB.net 的反射疑惑

2013年10月10日 ⁄ 综合 ⁄ 共 1017字 ⁄ 字号 评论关闭

  昨日同事用 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" 后,成功!

抱歉!评论已关闭.