.net中 关于反射的详细介绍(7)

if (m.Name.Equals("Set", StringComparison.Ordinal) && pi[0].ParameterType == typeof(int))
               {
                   object[] args = new object[2];
                   args[0] = 9;
                   args[1] = 10;
                   //参数reflectOb,为一个对象引用,将调用他所指向的对象上的方法,如果为静态方法这个参数必须设置为null
                   //参数args,为调用方法的参数数组,如果不需要参数为null
                   m.Invoke(reflectOb, args);   //调用MyClass类中的参数类型为int的Set方法,输出为Inside set(int,int).x:9, y:10
               }
           }
           Console.ReadKey();
        }
    }


获取Type对象的构造函数

         在这之前的阐述中,由于MyClass类型的对象是都是显式创建的,因此使用反射技术调用MyClass类中的方法是没有任何优势的,还不如以普通方式调用方便简单呢。但是,如果对象是在运行时动态创建的,反射功能的优势就会显示出来。在这种情况下,要先获取一个构造函数列表,然后调用列表中的某个构造函数,创建一个该类型的实例。通过这种机制,可以在运行时实例化任意类型的对象,而不必在声明语句中指定类型。

复制代码 代码如下:


View Code

class MyClass
    {
        int x;
        int y;
        public MyClass(int i)
        {       
            x = y + i;
        }
        public MyClass(int i, int j)
        {           
            x = i;
            y = j;
        }
        public int sum()
        {
            return x + y;
        }
    }

class InvokeConsDemo
    {
        static void Main()
        {
            Type t = typeof(MyClass);
            int val;
            ConstructorInfo[] ci = t.GetConstructors();  //使用这个方法获取构造函数列表

int x;
            for (x = 0; x < ci.Length; x++)
            {
                ParameterInfo[] pi = ci[x].GetParameters(); //获取当前构造函数的参数列表
                if (pi.Length == 2) break;    //如果当前构造函数有2个参数,则跳出循环
            }

if (x == ci.Length)
            {
                return;
            }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjgpds.html