反射获取程序集的信息

反射主要是用来获取类型和程序集的信息,在System.Reflection命名空间,通常是在System命名空间下的Type类一起使用; 

获取程序集信息(Assembly)控制程序集,通过属性和方法可以获取程序集元数据信息,在获取元数据之前,需要先用Assembly类的Load方法(或LoadFile()LoadFrom())将程序集加载到内存中;Assembly是抽象类只能通过方法、字段等的返回值来声明对象, 就是通过load方法返回值来声明Assembly的对象,加载程序集,Loading是在

 Assembly a = Assembly.Load("MyReflection");

除此之外可以利用GetType和Typeof来获取程序集中的类型,它们返回到都是Type的对象

Type t = a.GetType("MyReflection." + PersonName);

在调用的类的方法是时候,必须要创建类的实例,两种方法获取类的实例返回object类型

方法一:通过Activator.CreateInstance()
object obj = Activator.CreateInstance(t);
//方法二:通过实例的方法来返回object 
object obj = a.CreateInstance("MyReflection." + PersonName);

如果没有定义抽象类和接口时用MethodInfo类的Invoke方法来执行程序集中类的实例方法,下面执行类中say方法

 MethodInfo mi = t.GetMethod("Say");、
 mi.Invoke(obj, null);

下面来完成简单的反射动态获取程序集的信息以及类型方法的执行,这里定义程序集MyReflection,任意输入程序集中的类型,来执行指定类型的方法

namespace MyReflection
{
     class Program
       {
        static void Main(string[] args)
        {

string PersonName = Console.ReadLine();
 Assembly a = Assembly.Load("MyReflection");
Type t = a.GetType("MyReflection." + PersonName);
object obj = Activator.CreateInstance(t);
MethodInfo mi = t.GetMethod("Say");
mi.Invoke(obj, null);
        }
abstract class Person
    {
        public abstract void Say();
    }
    class Chinese : Person //继承
    {
        public override void Say()
        {
        }
    }
    class Han : Chinese
    {
        public override void Say()
        {
            Console.WriteLine("this is  Han Say()");
        }
        public void HanSay()
        { }
    }
    class DaiZu : Chinese
    {
        public override void Say()
        {
            Console.WriteLine("this is DaiZu Say()");
        }
    }

    class English : Person
    {
        public override void Say()
        {
            Console.WriteLine("this is English Say()");
        }
    }
}

 

 

原文地址:https://www.cnblogs.com/sunli4295/p/fly.html