zoukankan      html  css  js  c++  java
  • 利用反射动态调用类成员[原创]


    1.首先建立一个类
        
    class PropertyClass
        
    {
        
    public PropertyClass()
        
    {
        }

            
    public PropertyClass(ref Int32 x) 
            
    {
                x 
    *= 5;
            }


            
    public int fieldValue = 0;

            
    private string name;

            
    public string Name
            
    {
                
    get return name; }
                
    set { name = value; }
            }


            
    public int GetInt(int value)
            
    {
                
    return value;
            }


            
    public void Display(string str)
            
    {
                Console.WriteLine(str);
            }


            
    public override String ToString()
            
    {
                
    return fieldValue.ToString();
            }

        }


    2.用反射的方式调用这个PropertyClass类中的方法
     
    public static void instanceLove()
            
    {
                PropertyClass propertyClass 
    = new PropertyClass();

                Type type 
    = propertyClass.GetType();
                
    //Type type = typeof(propertyClass);效果和上面语句一样,只是写法不同。

                
    object obj = type.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, nullnullnew object[] { });

                
    //调用没有返回值的方法
                
    //运行之后的结果[Hello World]
                type.InvokeMember("Display", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj, new object[] "Hello World" });

                
    //调用有返回值的方法
                
    //运行之后的结果[1982]
                int i = (int)type.InvokeMember("GetInt", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj, new object[] 1982 });

                
    //设置属性值
                
    //此时的Name 's Value为[My Name is Brian Lei]
                type.InvokeMember("Name", BindingFlags.SetProperty, null, obj, new object[] "My Name is Brian Lei" });

                
    //获取属性值
                
    //运行之后的结果[My Name is Brian Lei]
                string str = (string)type.InvokeMember("Name", BindingFlags.GetProperty, null, obj, null);

                
    //设置字段值
                type.InvokeMember("fieldValue", BindingFlags.SetField, null, obj, new object[] 813 });

                
    //获取字段值
                
    //运行之后的结果[813]
                int f = (int)type.InvokeMember("fieldValue", BindingFlags.GetField, null, obj, null);

                
    //调用override方法
                
    //运行之后的结果[813]
                String s = (String)type.InvokeMember("ToString", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, null);
                
                
    //调用构造方法
                
    //运行之后的结果[8*5=40]
                Object objs = type.InvokeMember(null,BindingFlags.DeclaredOnly |BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.CreateInstance, nullnullnew Object[] 8 });

            }


    3.写个Main函数测试一下
     
    class EntryPoint
        
    {
            
    static void Main()
            
    {
              Test.instanceLove();
            }

        }
       
  • 相关阅读:
    【FROM】java控件重绘AWT/SWINGPainting in AWT and Swing (EN)
    linux yum使用管理详细使用
    远程控制 vc++实现
    java 鼠标事件Dragged和Moved 及java显示GIF在JLabel、JButton
    C语言字符串函数大全
    C# 训练场(四)创建系统热键,并向活动窗口输入信息
    潜移默化学会WPF(样式) DataGrid(转载)
    时间查询
    Sqlserver2012 根据数据库mdf文件生成log文件,解决无法附加mdf文件
    我知道的一些 ”运行“ 窗体下的命令,个人使用
  • 原文地址:https://www.cnblogs.com/RuiLei/p/674833.html
Copyright © 2011-2022 走看看