反射(二)

一.动态创建对象

构造函数无参数构造对象

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();

        }

    }

}

原文地址:https://www.cnblogs.com/hometown/p/3204226.html