使用C#进行Reflection编程

原创 2004年07月30日 16:14:00

代码如下:

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

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

c# reflection的作用

Reflection 顾名思义,反映,反思。就是在程序运行的时候,能够反映程序正在执行的结构体和集合的信息的方法。这个结构体当然包括类。光是反映的信息还是不行,还要对反映的信息处理,这才称得上是反思。...
  • CGGUANG
  • CGGUANG
  • 2016年12月05日 12:54
  • 266

C#的Reflection总结

什么是反射 在.NET中的反射也可以实现从对象的外部来了解对象(或程序集)内部结构的功能,哪怕你不知道这个对象(或程序集)是个什么东西,另外.NET中的反射还可以运态创建出对象并执行它其中的方法。 ...
  • cxihu
  • cxihu
  • 2016年03月03日 22:16
  • 443

Linux下使用Vim进行C/C++ 编程基础知识详解

(预备知识) 学习Vim:  http://www.cnblogs.com/starspace/archive/2009/05/15/1458044.html 配置Vim:  http:/...
  • zhu2695
  • zhu2695
  • 2016年05月22日 00:22
  • 2538

Linux下C语言开发(进程控制编程——fork()、exec函数族)

在Linux中创建一个新进程的唯一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,因为fork()函数看起来执行一次却返回两个值。...
  • Thanksgining
  • Thanksgining
  • 2014年12月15日 15:00
  • 4011

C语言中使用CreateProcess创建进程(或执行win命令行)

转载请注明出处: 实际上用system()函数就可以执行windows命令行,不过略显简陋,下面介绍更复杂的CreateProcess() WIN32API函数CreateProcess用来创...
  • jeakon
  • jeakon
  • 2013年01月26日 17:28
  • 4838

C#编程 Reflection(反射)

学习C#已有不长不短的一段时间了,反射对我来说一直是很神秘,让我敬而远之,开始做公司系统也有近三个月的时间了,从开始到公司熟悉业务,时逢缺人之季,没过几天就开始修改Bug,到后来做些小需求,做为一个刚...
  • alwaysmilexl
  • alwaysmilexl
  • 2011年10月13日 23:24
  • 226

使用C#2005进行ASP .NET 2.0电子商务编程

  • 2008年09月17日 12:05
  • 12.74MB
  • 下载

使用C#2005进行ASP .NET 2.0电子商务编程.part2.rar

  • 2008年08月07日 12:24
  • 4.77MB
  • 下载

使用C#进行CAN 总线编程

  • 2008年11月07日 12:25
  • 196KB
  • 下载

使用 OpenCL.Net 进行 C# GPU 并行编程

在初探 C# GPU 通用计算技术中,我使用 Accelerator 编写了一个简单的 GPU 计算程序。也简单看了一些 Brahma 的代码,从它的 SVN 最新代码看,Brahma 要转移到使用 ...
  • wlanye
  • wlanye
  • 2013年03月09日 15:59
  • 941
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用C#进行Reflection编程
举报原因:
原因补充:

(最多只允许输入30个字)