反射实例【转】

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//必须得加的命名空间
using System.Reflection;

namespace 反射举例
{
    public class Program
    {
        private String file = @"反射举例.exe";

        static void Main(string[] args)
        {
            Program test = new Program();
            test.DisplayModules();
            test.DisplayTypes();
            test.DisplayMethods();
            test.InvokeStaticMethod();
            test.InvokeMethod();
            Console.ReadLine();
        }
        //显示所有模块名
        public void DisplayModules()
        {
            Console.WriteLine("display modules ...");
            Assembly assembly = Assembly.LoadFrom(file);
            Module[] modules = assembly.GetModules();
            foreach (Module module in modules)
            {
                Console.WriteLine("module name:" + module.Name);
            }
        }
        //显示所有类型名
        public void DisplayTypes()
        {
            Console.WriteLine("display types ...");
            Assembly assembly = Assembly.LoadFrom(file);
            Type[] types = assembly.GetTypes();
            foreach (Type type in types)
            {
                Console.WriteLine("type name:" + type.FullName);
            }
        }
        //先是一个类型中的所有方法名
        public void DisplayMethods()
        {
            Console.WriteLine("display methods in TestReflection Type ...");
            Assembly assembly = Assembly.LoadFrom(file);
            Type type = assembly.GetType("反射举例.Program");
            MethodInfo[] methods = type.GetMethods();
            foreach (MethodInfo method in methods)
            {
                Console.WriteLine("method name:" + method.Name);
            }
        }
        //调用一个类中的静态方法
        public void InvokeStaticMethod()
        {
            Console.WriteLine("Invoke static method ...");
            Assembly assembly = Assembly.LoadFrom(file);
            Type type = assembly.GetType("反射举例.TestSubClass");
            type.InvokeMember("SayHello", BindingFlags.InvokeMethod, null, null, new object[] { });
        }
        //调用一个类中的非静态方法
        public void InvokeMethod()
        {
            Console.WriteLine("Invoke Method ...");
            Assembly assembly = Assembly.LoadFrom(file);
            Type type = assembly.GetType("反射举例.TestSubClass");
            Object obj = Activator.CreateInstance(type);
            TestClass tc = (TestClass)obj;
            type.InvokeMember("Test1", BindingFlags.InvokeMethod, null, tc, new object[] { });
            type.InvokeMember("Test2", BindingFlags.InvokeMethod, null, tc, new object[] { });
        }
    }
    public interface TestClass
    {
        void Test1();
        void Test2();
    }
    public class TestSubClass : TestClass
    {
        public void Test1()
        {
            Console.WriteLine("This is TestSubClass.Test1");
        }
        public void Test2()
        {
            Console.WriteLine("This is TestSubClass.Test2");
        }
        public static void SayHello()
        {
            Console.WriteLine("This is TestSubClass.SayHello");
        }
    }

}

原文地址:https://www.cnblogs.com/zhouyunbaosujina/p/3328618.html