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");
}
}
}