当前位置:编程学习 > C#/ASP.NET >>

反射为什么无法获取Button事例的ID和Text?



    public class FieldInfoClass
    {
        protected Button btn;
        public FieldInfoClass()
        {
            btn = new Button();
            btn.Text = "test button";
            btn.ID = "btn1";
        }
        public void Show()
        { 

            ShowFields(this.GetType());             //为什么 不可以 获取到btn 的Text和ID属性值??
            ShowFields(typeof(FieldInfoClass));     //为什么 不可以 获取到btn 的Text和ID属性值??

             ShowProperties(btn.GetType()); //可以获取
        }

        public void ShowFields(Type thisGetType)
        {
            Console.WriteLine("\n\t\t\t ShowFields");
            FieldInfo[] fieldinfo = thisGetType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);

            foreach (FieldInfo item in fieldinfo)
            {
                if (item.FieldType.ToString().Equals("System.Web.UI.WebControls.Button"))
                {
                    ShowProperties(item.GetType().BaseType);
                }
            }

        }

        public void ShowProperties(Type itemGetType)
        {
            Console.WriteLine("\n\t\t\t ShowProperties");
            PropertyInfo[] propertys = itemGetType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
            Console.WriteLine("\n PropertyInfo         ");
            foreach (PropertyInfo property in propertys)
            {

                if (property.Name.ToLower() == "text")
                {
                    Console.WriteLine("\t\t\t\t\tName          : {0}", property.Name);
                    Console.WriteLine("\t\t\t\t\ttext      : {0}", property.GetValue(btn, null));
                }
                if (property.Name.ToLower() == "id")
                {
                    Console.WriteLine("\t\t\t\t\tName       : {0}", property.Name);
                    Console.WriteLine("\t\t\t\t\t{0}      : {1}", property.Name, property.GetValue(btn, null));
                }
                // Console.WriteLine("\n\t\t\t property Name          : {0}", property.Name);
            }
        }
    }



为什么无法获取字段“btn”的ID和Text属性? --------------------编程问答-------------------- 检查这句 FieldInfo[] fieldinfo = thisGetType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);

fieldinfo 里是否包含了FieldInfoClass.btn字段? --------------------编程问答-------------------- 是的,有包括的 --------------------编程问答--------------------  if (item.FieldType.ToString().Equals("System.Web.UI.WebControls.Button"))
筛选条件只要的是Button

你还想获得啥

直接把这个筛选条件去掉试试 --------------------编程问答--------------------
引用 3 楼  的回复:
 if (item.FieldType.ToString().Equals("System.Web.UI.WebControls.Button"))
筛选条件只要的是Button

你还想获得啥

直接把这个筛选条件去掉试试

是Button 的。
监视如下:




Name Value Type
- item {System.Web.UI.WebControls.Button btn} System.Reflection.FieldInfo {System.Reflection.RtFieldInfo}
+ [System.Reflection.RtFieldInfo] {System.Web.UI.WebControls.Button btn} System.Reflection.RtFieldInfo
+ base {System.Web.UI.WebControls.Button btn} System.Reflection.MemberInfo {System.Reflection.RtFieldInfo}
Attributes Family System.Reflection.FieldAttributes
+ FieldHandle {System.RuntimeFieldHandle} System.RuntimeFieldHandle
+ FieldType {Name = "Button" FullName = "System.Web.UI.WebControls.Button"} System.Type {System.RuntimeType}
--------------------编程问答-------------------- 可还是拿个不到ID和Text的值!!! --------------------编程问答--------------------

 foreach (FieldInfo item in fieldinfo)
            {
                if (item.FieldType.ToString().Equals("System.Web.UI.WebControls.Button"))
                {
                    ShowProperties(item.GetType().BaseType);
                }
            }

你的判断条件位置不正确 --------------------编程问答-------------------- 直接debug  一步一步跟跟 --------------------编程问答--------------------
  public void ShowFields(Type thisGetType)
        {
            Console.WriteLine("\n\t\t\t ShowFields");
            FieldInfo[] fieldinfo = thisGetType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);

            foreach (FieldInfo item in fieldinfo)//fieldiinfo只有一个FieldInfo。
            {
                if (item.FieldType.ToString().Equals("System.Web.UI.WebControls.Button"))//这个为什么不正确??
                {
                    ShowProperties(item.GetType().BaseType);
                }
            }

        }
--------------------编程问答--------------------
  
foreach (FieldInfo item in fieldinfo)//fieldiinfo只有一个FieldInfo。
            {
                if (item.FieldType.ToString().Equals("System.Web.UI.WebControls.Button")) 
                {
                    ShowProperties(item.GetType().BaseType); //问题在此处,应该是“item.FieldType”
                }
            }


此问题已经解决,谢谢各位。 --------------------编程问答-------------------- [align=right]
很模糊的记得只能获类的你有访问权限的属性没有的话是获取不到的,,好像GetFields获取属性非这个,这个是获取字段吧
[/align] --------------------编程问答--------------------
引用 8 楼  的回复:
这个为什么不正确??

个人感觉 是你整体的思路不正确
你的目的是获得 这个Button对象中ID和Text现在的值了吧?
但是你看看你的方法传的参数,或者处理的对象是什么?是Type,也就是这个Button的类型 不是一个具体的实例

另外找你的这个button还需要考虑特殊情况,即它不是某个对象的第一层的属性或者变量,所以处理这种问题最好用递归,方法参数是你具体的Control或者实例,不是Type

--------------------编程问答-------------------- 贴一段我博客中的内容


  void SetTextBoxEnalbe(Control control, bool enable)
        {
            if (control is TextBox)
            {
                (control as TextBox).Enabled = true;
            }
            else if (control.HasControls())
            {
                foreach (System.Web.UI.Control s in control.Controls)
                {
                    if (s is TextBox)
                    {
                        (s as TextBox).Enabled = enable;
                    }
                    else if (s.HasControls())
                    {
                        SetTextBoxEnalbe(s, enable);
                    }
                }
            }
        }

当然这种情况是确定在web页面中找的,他们的基类都是Control
lz可以根据你的实际情况传合适的参数  但是 一定要是具体的实例 不是你上面使用Type --------------------编程问答-------------------- BaseType是父类的类型,Text,Id属性都是虚属性,已经被重写 当然获取不到了 --------------------编程问答-------------------- 这个方法好像真的有些行不通!!
就方法 PropertyInfo.GetValue 时,需要的也是个具体的Object。这中方式的话,object那里来啊? --------------------编程问答--------------------

 public void ShowFields(T t)
        {
            Type thisGetType=t.GetType();
            Console.WriteLine("\n\t\t\t ShowFields");
            FieldInfo[] fieldinfo = thisGetType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);

            foreach (FieldInfo item in fieldinfo)
            {
                if (item.FieldType.ToString().Equals("System.Web.UI.WebControls.Button"))
                {
                    ShowProperties(item.GetType().BaseType);
                }
            }

        }
 public void ShowProperties(T t)
        {
            Type itemGetType=t.GetType()
            Console.WriteLine("\n\t\t\t ShowProperties");
            PropertyInfo[] propertys = itemGetType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
            Console.WriteLine("\n PropertyInfo         ");
            foreach (PropertyInfo property in propertys)
            {

                if (property.Name.ToLower() == "text")
                {
                    Console.WriteLine("\t\t\t\t\tName          : {0}", property.Name);
                    Console.WriteLine("\t\t\t\t\ttext      : {0}", property.GetValue(t, null));
                }
                if (property.Name.ToLower() == "id")
                {
                    Console.WriteLine("\t\t\t\t\tName       : {0}", property.Name);
                    Console.WriteLine("\t\t\t\t\t{0}      : {1}", property.Name, property.GetValue(t, null));
                }
                // Console.WriteLine("\n\t\t\t property Name          : {0}", property.Name);
            }
        }

have a try! --------------------编程问答--------------------

 public void ShowFields(T t)
        {
            Type thisGetType=t.GetType();
            Console.WriteLine("\n\t\t\t ShowFields");
            FieldInfo[] fieldinfo = thisGetType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);

            foreach (FieldInfo item in fieldinfo)
            {
                if (item.FieldType.ToString().Equals("System.Web.UI.WebControls.Button"))
                {
                    ShowProperties(item.GetType().BaseType);
                }
            }

        }
 public void ShowProperties(T t)
        {
            Type itemGetType=t.GetType()
            Console.WriteLine("\n\t\t\t ShowProperties");
            PropertyInfo[] propertys = itemGetType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
            Console.WriteLine("\n PropertyInfo         ");
            foreach (PropertyInfo property in propertys)
            {

                if (property.Name.ToLower() == "text")
                {
                    Console.WriteLine("\t\t\t\t\tName          : {0}", property.Name);
                    Console.WriteLine("\t\t\t\t\ttext      : {0}", property.GetValue(t, null));
                }
                if (property.Name.ToLower() == "id")
                {
                    Console.WriteLine("\t\t\t\t\tName       : {0}", property.Name);
                    Console.WriteLine("\t\t\t\t\t{0}      : {1}", property.Name, property.GetValue(t, null));
                }
                // Console.WriteLine("\n\t\t\t property Name          : {0}", property.Name);
            }
        }

have a try! --------------------编程问答-------------------- PS:上面的代码也是不行的。

调用方法 PropertyInfo.GetValue 时,
需要的也是个具体的Object(将返回其属性值的对象)。
这个方式的object还是不知那里来啊?。 :)!!! --------------------编程问答-------------------- “反射”被用成这样,真让人无语啊~~ --------------------编程问答-------------------- 有空调试一下 --------------------编程问答--------------------
引用 11 楼  的回复:
引用 8 楼  的回复:
这个为什么不正确??

个人感觉 是你整体的思路不正确
你的目的是获得 这个Button对象中ID和Text现在的值了吧?
但是你看看你的方法传的参数,或者处理的对象是什么?是Type,也就是这个Button的类型 不是一个具体的实例

另外找你的这个button还需要考虑特殊情况,即它不是某个对象的第一层的属性或者变量,所以处理这种问题最好用递归,方法参……


+1
自己反射自己,想想都诡异 --------------------编程问答--------------------
引用 17 楼  的回复:
PS:上面的代码也是不行的。

调用方法 PropertyInfo.GetValue 时,
需要的也是个具体的Object(将返回其属性值的对象)。
这个方式的object还是不知那里来啊?。 :)!!!

那不是把t传进去了
还有就是 第二个方法的参数完全可以是 Button btn
因为你的第一个方法中,只有Button类型可以进入第二个方法
 public void ShowProperties(Button t)
        {
            Type itemGetType=t.GetType()
            Console.WriteLine("\n\t\t\t ShowProperties");
            PropertyInfo[] propertys = itemGetType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic);
            Console.WriteLine("\n PropertyInfo         ");
            foreach (PropertyInfo property in propertys)
            {

                if (property.Name.ToLower() == "text")
                {
                    Console.WriteLine("\t\t\t\t\tName          : {0}", property.Name);
                    Console.WriteLine("\t\t\t\t\ttext      : {0}", property.GetValue(t, null));
                }
                if (property.Name.ToLower() == "id")
                {
                    Console.WriteLine("\t\t\t\t\tName       : {0}", property.Name);
                    Console.WriteLine("\t\t\t\t\t{0}      : {1}", property.Name, property.GetValue(t, null));
                }
                // Console.WriteLine("\n\t\t\t property Name          : {0}", property.Name);
            }
        }
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,