代码如下:
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#的反射机制为开发者提供了强大的动态能力,使代码更加灵活,但同时也需要注意合理使用以保持性能和安全性。在日常开发中,反射通常用于解决特定场景下的复杂问题,如插件架构、元编程和数据序列化等。通过...
在C#编程语言中,反射(Reflection)是一个强大的工具,它允许程序在运行时检查自身的行为,包括类、接口、属性、方法等元数据信息,并能够动态地创建对象和调用方法。这篇压缩包文件提供了关于C#反射的实践示例,...
8. **.NET框架和库**:C#的高级编程也涉及到对.NET框架的理解,如使用Entity Framework进行ORM,使用ASP.NET构建Web应用程序,或者使用WPF、WinForms开发桌面应用等。 9. **单元测试和调试**:熟练使用MSTest、...
在C#中,实现插件式编程的关键在于使用.NET Framework的Assembly类和Reflection API。Assembly类允许程序在运行时加载和执行非嵌入的DLL文件,而Reflection API则用于动态地检查和实例化这些DLL中的类型和方法。下面...
《C#实用编程百例》是一本专注于C#编程实践的书籍,其光盘源码包含了大量的实例,旨在帮助读者深入理解和掌握C#语言的核心概念和技术。这些实例覆盖了C#编程的各个方面,从基础语法到高级特性,是学习和提升C#编程...
在IT领域,C#是一种广泛使用的面向对象的编程语言,尤其在开发Windows应用程序和Web服务时。本资源包“C#数据库编程相关电子书”涵盖了C#编程中的几个关键概念,包括序列化与反射、接口类型、面向对象编程(OOP)...
在C#编程环境中,创建一个计算器程序涉及到许多基础和进阶的编程概念。这个"ProgramCalculator"项目旨在实现一个简单的计算器应用,它不仅提供基本的加、减、乘、除运算,还可能扩展到支持更复杂的函数计算。下面将...
《C#高效编程改进C#代码的50个行之有效的办法(第2版)》是一本专注于提升C#编程效率的专业书籍。本书的核心在于提供一系列实用的技巧和最佳实践,帮助开发者优化代码,提高软件开发的效率和质量。下面,我们将详细...
C#中的动态代理(如System.Reflection.Emit命名空间)和接口代理(如InterceptableProxy)可以实现远程调用、权限控制等功能。 10. **策略模式(Strategy)**:定义一系列的算法,把它们一个个封装起来,并且使它们...
C#反射(Reflection)是.NET框架提供的一种强大的元数据访问机制,它允许程序在运行时检查自身的行为和属性。在C#中,反射允许我们动态地创建对象、获取类型信息、调用方法、访问字段和属性,以及遍历类型的继承层次...
"ReflectionExample"可能是包含一系列C#代码示例的项目,用于演示如何使用反射来实现动态编程。下面将详细阐述C#反射的基本概念、用途及其常见操作。 一、什么是C#反射? C#反射是一种在运行时检查类型信息的能力...
4. **调用DLL函数**:在C#代码中,使用`System.Reflection`命名空间加载DLL并调用Matlab函数。以下是一个示例: ```csharp using System; using System.Reflection; ... Assembly matlabDll = Assembly.Load...
在"C# Windows应用高级编程-编程篇"这个经典教程中,深入探讨了使用C#语言进行Windows应用程序开发的高级技术。教程涵盖了多个关键知识点,旨在帮助开发者提升在Visual Studio C#(VSC#)环境下的编程技能。以下是...
【C#3.0高级编程教程源码】是一个深度探讨C#编程语言的资源集合,主要针对C#3.0版本。这个教程不仅包含了丰富的理论知识,还提供了大量的实际源码,帮助学习者通过实践来理解和掌握C#的高级特性。下面我们将详细探讨...
在IT行业中,C#是一种广泛使用的面向对象的编程语言,尤其在开发Windows应用程序和游戏时。插件(Plugin)编程是软件开发中的一个重要概念,它允许我们通过动态加载额外的代码模块来扩展软件功能,而无需修改原始...
在本实例中,我们将探讨“一个简单的C#插件编程实例”,这非常适合对C#编程感兴趣的初学者进行学习。 C#是微软开发的一种面向对象的编程语言,具有丰富的类库和强大的.NET框架支持,因此它是实现插件架构的理想选择...
《深入.NET平台和C#编程》是针对.NET框架和C#编程语言的深入解析,尤其在第九章中,我们将会探讨一系列关键知识点,这些知识点对于理解.NET开发的基础和高级概念至关重要。这一章节可能涵盖诸如类型系统、面向对象...
### C#4.0编程(第6版)关键知识点概览 #### 一、书籍基本信息与概述 **中文名:** C#4.0编程 (第6版,涵盖Visual Studio 2010以及.NET4) **原名:** Programming C# 4.0: Building Windows, Web, and RIA ...
在本文中,我们将深入探讨如何使用C#进行Visual C#数据库编程,特别是针对ACCESS数据库的操作。C#是一种广泛用于开发Windows应用程序的语言,它与.NET框架相结合,提供了强大的数据访问功能。在C#中操作ACCESS数据库...
C#中的`System.Reflection.Emit`和`System.Linq.Expressions`命名空间提供了动态生成类型的能力,可以用于创建代理类。例如,`Castle.DynamicProxy`库就是基于动态代理实现AOP的。动态代理在运行时创建代理类,可以...