反射的学习

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

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

简单用反射的步骤: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);
            }
        }
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值