使用C#进行Reflection编程

来源:互联网 发布:java文件系统加密解密 编辑:程序博客网 时间:2024/05/14 04:08

代码如下:

using System;
using System.Reflection;
using System.Reflection.Emit ;

public class TestReflection {
 private String file = @"TestReflection.exe";

 static void Main(String[] args) {
  TestReflection test = new TestReflection();
  test.DisplayModules();
  test.DisplayTypes();
  test.DisplayMethods();
  test.InvokeStaticMethod();
  test.InvokeMethod();
 }
 //显示所有模块名
 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("TestReflection");      
  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");
 }
}

编译运行后输出:

display modules ...
module name:TestReflection.exe
display types ...
type name:TestReflection
type name:TestClass
type name:TestSubClass
display methods in TestReflection Type ...
method name:GetHashCode
method name:Equals
method name:ToString
method name:DisplayModules
method name:DisplayTypes
method name:DisplayMethods
method name:InvokeStaticMethod
method name:InvokeMethod
method name:Test2
method name:GetType
Invoke static method ...
This is TestSubClass.SayHello
Invoke Method ...
This is TestSubClass.Test1
This is TestSubClass.Test2

 

原创粉丝点击