• 反射(二)


    一.动态创建对象

    构造函数无参数构造对象

    class MyClass

        {

            privatestring _name;

            publicstring Name

            {

                get

                {

                    return _name;

                }

                set

                {

                    _name = value;

                }

            }

        }

     

        class Program

        {

            staticvoid Main(string[] args)

            {

                Assembly myass = Assembly.GetExecutingAssembly();//获取程序集

                MyClass my = myass.CreateInstance("ConsoleApplication7.MyClass", true) as MyClass;//创建程序集中类型的实例方法一,CreateInstance,参数分别为类型名称和是否大小写无关。

                my.Name = "rxm";

                Console.WriteLine(my.Name);

     

                ObjectHandle handle = Activator.CreateInstance(null, "ConsoleApplication7.MyClass");//创建程序集中类型的实例方法二,CreateInstance,参数分别为程序集名称(null表示当前),类型名称。

                MyClass mynew = handle.Unwrap() as MyClass;

                mynew.Name = "bj";

                Console.WriteLine(mynew.Name);

                Console.Read();

            }

        }

    构造函数有参数构造对象

    namespace ConsoleApplication7

    {

        class MyClass

        {

            privatestring _name;

            privatestring _id;

            public MyClass(string id, string name)

            {

                this._id = id;

                this._name = name;

            }

            publicstring ID

            {

                get

                {

                    return _id;

                }

            }

            publicstring Name

            {

                get

                {

                    return _name;

                }

                set

                {

                    _name = value;

                }

            }

        }

     

        class Program

        {

            staticvoid Main(string[] args)

            {

                Assembly myass = Assembly.GetExecutingAssembly();//获取程序集

                object[] parameters = new object[2]; //构造函数的列表集合

                parameters[0] = "001";

                parameters[1] = "rxm";

                MyClass obj = myass.CreateInstance("ConsoleApplication7.MyClass", true, BindingFlags.Default, null, parameters, null, null) as MyClass;

                Console.WriteLine(obj.Name);

                Console.WriteLine(obj.ID);

                Console.Read();

            }

        }

    }

    二.动态调用方法

    如果根据以上获得MyClass对象进行方法的调用,就和常规的方法调用一样了。

    下面主要是通过.Net Reflection的方法实现。

    namespace ConsoleApplication1

    {

        class MyClass

        {

            public int Add(int a, int b)

            {

                return a + b;

            }

            public static int square(int num)

            {

                return num * num;

            }

        }

     

        class Program

        {

            static void Main(string[] args)

            {

                Assembly ass = Assembly.GetExecutingAssembly();

                object obj = ass.CreateInstance("ConsoleApplication1.MyClass", true);

                Type t = typeof(MyClass);

                object[] parameters = new object[2];

                parameters[0] = 3;

                parameters[1] = 4;

                int result = (int)t.InvokeMember("Add", BindingFlags.InvokeMethod, null, obj, parameters);//参数解析:方法名,说明调用的是个方法(也可以是字段/属性等),一个对象(该对象定义一组属性并启用绑定),非静态方法要说明是哪个对象调用,参数组。

     

                //实例方法调用

                MethodInfo addMethord = t.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public);//获得一个方法。参数解析:方法名,方法描述(public的和可实例化的)。

                int result_invoke = (int)addMethord.Invoke(obj, parameters);//根据得到的方法Invoke结果(对象实例,参数列表[没有为null])

     

                //静态方法调用

                MethodInfo squMethod = t.GetMethod("square", BindingFlags.Static | BindingFlags.Public);//静态的,public

                object[] staticParameters = new object[] { 9 };

                Console.WriteLine((int)squMethod.Invoke(t, staticParameters));//81//由于是静态方法,参数一应该是属于的类型,或直接为null(不属于任何实例)

                Console.WriteLine((int)squMethod.Invoke(null, staticParameters));//81

                Console.WriteLine(result_invoke.ToString());

                Console.WriteLine(result.ToString());

                Console.Read();

            }

        }

    }

  • 相关阅读:
    C++中的句柄类
    普林斯顿大学算法课 Algorithm Part I Week 3 自我总结
    普林斯顿大学算法课 Algorithm Part I Week 3 排序的应用 System Sorts
    普林斯顿大学算法课 Algorithm Part I Week 3 重复元素排序
    普林斯顿大学算法课 Algorithm Part I Week 3 求第K大数 Selection
    普林斯顿大学算法课 Algorithm Part I Week 3 快速排序 Quicksort
    普林斯顿大学算法课 Algorithm Part I Week 3 排序稳定性 Stability
    普林斯顿大学算法课 Algorithm Part I Week 3 比较器 Comparators
    普林斯顿大学算法课 Algorithm Part I Week 3 排序算法复杂度 Sorting Complexity
    普林斯顿大学算法课 Algorithm Part I Week 3 归并排序 Mergesort
  • 原文地址:https://www.cnblogs.com/hometown/p/3204226.html
Copyright © 2020-2023  润新知