反射的学习

  • Post author:
  • Post category:其他


还记得当初面试的时候,面试官还问了我对反射的理解的。当时,只知道 有这个东西,却不知道怎么用。今天特地研究了下。

就我的理解是:可以在运行中获得程序的成员。

简单用反射的步骤:1.先获取该程序的名字。

Assembly a


=


Assembly.LoadFrom (“ReflectionExample.exe”);

2.再获取该程序中的类。

Type[ ] mytypes


=


a.GetTypes( );

3.再就可以获取该类中的方法了。

MethodInfo[] mif = ht.GetMethods(); 
      foreach(MethodInfo mf in mif) 
      {           
System.Console.WriteLine(mf.Name); 
      } 

如果要调用该类中的一个具体方法,这里以构造函数为例:

1.创建一个该类型的实例。Type ht=typeof(HelloWord);   Object obj = Activator.CreateInstance(ht);—HelloWord是该类型名

2.获取要实现的方法。 MethodInfo mSayHello = ht.GetMethod(“SayHello”);

3.实现。mSayHello.Invoke(obj, null);

若要实现带参数的构造函数:

1.给参数赋值。string[] s ={ “圣诞老人”};

2.创建一个该类型的实例。Object objName = Activator.CreateInstance(ht, s);

3.获取要实现的方法。 MethodInfo mSayHello = ht.GetMethod(“SayHello”);

4.mSayHello.Invoke(objName, null);

刚刚开始学习反射,请大家多多指导。

以下是此实例的所有代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace ConsoleReflectionExam
{
    class Program
    {
        [STAThread]  //指示应用程序的COM线程模型是单线程单元(STA)
        static void Main(string[] args)
        {
            Console.WriteLine("列出程序集中的所有类型:");
            Assembly a = Assembly.LoadFrom("ConsoleReflectionExam.exe");
            Type[] myTypes = a.GetTypes();
            foreach (Type t in myTypes)
            {
                Console.WriteLine(t.FullName);
            }

            Console.ReadKey();

            Console.WriteLine("列出HelloWord中的所有方法:");
            Type ht=typeof(HelloWord);
            MethodInfo[] mif = ht.GetMethods();

            foreach (MethodInfo mf in mif)
            {
                Console.WriteLine(mf.Name);
            }
            Console.ReadKey();

            Console.WriteLine("实例化HelloWord,并且调用SayHello方法 ");
            Object obj = Activator.CreateInstance(ht);
            MethodInfo mSayHello = ht.GetMethod("SayHello");
            mSayHello.Invoke(obj, null);

            string[] s ={ "圣诞老人"};
            Object objName = Activator.CreateInstance(ht, s);
            BindingFlags flags = BindingFlags.InvokeMethod;           
            mSayHello.Invoke(objName, null);
            Console.ReadKey();
        }
    }

    public class HelloWord
    {
        string myName = null;
        public HelloWord(string name)
        {
            myName = name;
        }

        public HelloWord()
            : this(null)
        {
        }

        public string Name
        {
            get
            {
                return myName;
            }
        }

        public void SayHello()
        {
            if (myName == null)
            {
                Console.WriteLine("Hello Word");
            }
            else
            {
                Console.WriteLine("Hello {0}",myName);
            }
        }
    }
}



版权声明:本文为mm3646原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。