基础命名空间:反射 using System.Reflection
反射概念:
.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,程序集包含模块 模块包含类型,类型又包含
成员,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息, .NET Framework提供命名空间System.Refection和
System.Type,可以获取已加载的程序集和程序集中定义的类型(类、接口、值类型)的信息也可以使用反射在运行时创建类型实例,将类型绑定到现有
对象,或主从现有对象中获取类型,调用和访问这些实例
练习示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Business; namespace FirstReflection
{
public class ComputerFactory : IMessageHandler
{
//品牌
public string brand { get; set; }
//地址
public string address { get; set; } /// <summary>
/// 构造函数
/// </summary>
public ComputerFactory()
{ }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="brand"></param>
public ComputerFactory(string brand,string address)
{
this.brand = brand;
this.address = address;
} public void displayBrand()
{
Console.WriteLine(this.brand);
} public void displayaddress(string address)
{
Console.WriteLine("public:生产地址:{0}",address);
} public static void displayaddress()
{
Console.WriteLine("public static共有方法:生产地址:本部");
} private void privatedisplayaddress(string address)
{
Console.WriteLine("private私有方法:生产地址:{0}", address);
}
}
}
通过Assembly类的load()方法加载程序集,并在程序集中查找定义的类型......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection; namespace FirstReflection
{
/*反射:
1.获取方法的信息
2.调用方法
3.构造对象
4.从程序集中加载类型
*/ public class Program
{
//查看程序集中所有的类
public static void ShowClassName(Type[] types)
{
Console.WriteLine("查看程序集中所有的类:");
foreach (Type type in types)
{
Console.WriteLine(type);
}
} public static void ShowModuleName(Module[] modules)
{
Console.WriteLine("查看程序集中所有的模块:");
foreach (Module module in modules)
{
Console.WriteLine(module);
}
} public static void ShowPropertyName(PropertyInfo[] properties)
{
Console.WriteLine("查看该类型的属性:");
foreach (PropertyInfo property in properties)
{
Console.WriteLine(property);
}
} static void Main(string[] args)
{ //[0]
//加载程序集
Assembly assembly = Assembly.Load("FirstReflection");
//Assembly assembly = Assembly.LoadFrom("FirstReflection.exe"); //[1]:查看程序集中所有的类
Type[] types = assembly.GetTypes();
ShowClassName(types); //[2]:查看模块
Module[] modules = assembly.GetModules();
ShowModuleName(modules); //[3]:取得类类型
Type getType = assembly.GetType("FirstReflection.ComputerFactory");
Type getTypeTwo = Type.GetType("FirstReflection.ComputerFactory");
//Console.WriteLine(getType);//输出:FirstReflection.ComputerFactory //[4]:查看该类的属性
PropertyInfo[] properties = getType.GetProperties();
ShowPropertyName(properties);//protected、private 属性未获取到 //[5]:查看实现的接口
Type[] iTypes = getType.GetInterfaces();
Console.WriteLine("查看继承的接口:");
foreach (var item in iTypes)
{
Console.WriteLine(item.Name);
} //[6]:查看类的所有方法(只获取public方法) *****
/*【get;set访问器也会被解析】*/
MethodInfo[] methods = getType.GetMethods();
Console.WriteLine("查看类的所有方法:");
foreach (var item in methods)
{
Console.WriteLine(item);
} //[6-2]:查找public方法 与getType.GetMethods()返回结果一样
MethodInfo[] publicMethods = getType.GetMethods(BindingFlags.Instance | BindingFlags.Public);
Console.WriteLine("查看类的public方法:");
foreach (var item in publicMethods)
{
Console.WriteLine(item);
} //[6-1]:查找私有方法(protected、private)
//NonPublic指反射,但找到的属性/特性是NonPublic访问的
//Instance 只是找到实例的引用对象,类似c++中的实例句柄指针(当然这个是枚举类型)
MethodInfo[] nonPublicMethods = getType.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic);
Console.WriteLine("查看类的私有方法:");
foreach (var item in nonPublicMethods)
{
Console.WriteLine(item);
} //[7]:获取构造函数
ConstructorInfo[] constructors = getType.GetConstructors();
Console.WriteLine("查看类的够着方法:");
foreach (var item in constructors)
{
Console.WriteLine(item);
} //[8]:创建实例
//方法1(有问题)
object IBMcomputer = Assembly.GetAssembly(getType).CreateInstance("ComputerFactory");
//方法2
object[] constructParam = new object[] { "HP","北京" };
//带参数
object HPcomputer = Activator.CreateInstance(getType, constructParam);
//不带参数
object HPcomputer2 = Activator.CreateInstance(getType, null); //[9]:使用反射调用方法(public方法)
foreach (MethodInfo m in publicMethods)
{
if (m.Name == "displayaddress")
{//调用public void displayaddress(string address)()
object[] Param = new object[] { "北京" };
m.Invoke(HPcomputer2, Param);
}
}
//[9-1]:使用反射调用方法 (NonPublic 方法)
MethodInfo met = getType.GetMethod("privatedisplayaddress", BindingFlags.Instance | BindingFlags.NonPublic);
object[] Param2 = new object[] { "北京" };
met.Invoke(HPcomputer2, Param2); //[9-*]其他 Console.ReadLine(); }
} }
查看结果:

其中:查看类的所有方法出现 get_brand(), set_brand() 说明 get/set访问器在编译时 生成的公有方法get_brand(), set_brand()
步骤:
1.加载程序集 使用Assembly类的Load()或者LoadFrom()方法加载程序集,区别是后者需要加入程序集的后缀名,例如.DLL .exe
2.找到相应的命名空间+类 Type类型也是抽象类,只能通过GetType()或者typeof()来实现
3.获取类的方法 getMethod() 根据需要调用的方法的访问级别 public protected privat 及static传入相应的参数 方法名+ (BindingFlags.Instance | BindingFlags.Public)等
4.调用方法 MethodInfo.Invoke() 传入实例,方法的参数
基础命名空间:反射 using System.Reflection的更多相关文章
- C#反射发出System.Reflection.Emit学习
一.System.Reflection.Emit概述 Emit,可以称为发出或者产生.与Emit相关的类基本都存在于System.Reflection.Emit命名空间下.反射,我们可以取得形如程序集 ...
- 黑马程序员_Java基础:反射机制(Reflection)总结
------- android培训.java培训.期待与您交流! ---------- 反射在java中有非常重大的意义,它是一种动态的相关机制,可以于运行时加载.探知.使用编译期间完全未知的clas ...
- 基础命名空间:序列化 System.Runtime.Serialization
对象通常都有状态(state),从一个对象中抽取这种状态,不论是将它存储于某地,还是通过网络传送,这种抽取动作称为“将一个对象序列化”,而反向处理过程,从一个被序列化的状态重建一个对象即为反序列化. ...
- System.Reflection.Emit学习
C#反射发出System.Reflection.Emit学习 分享: 1 一.System.Reflection.Emit概述 Emit,可以称为发出或者产生.与Emit相关的类基本都存在于Syste ...
- 反射基础 System.Reflection
一.获取程序集Assembly 1.获取当前运行的程序集 System.Reflection.Assembly[] asm = AppDomain.CurrentDomain.GetAssemblie ...
- 【C#基础】System.Reflection (反射)
在使用.NET创建的程序或组件时,元数据(metadata)和代码(code)都存储于"自成一体"的单元中,这个单元称为装配件.我们可以在程序运行期间访问这些信息.在System. ...
- C# System.Reflection (反射)
在使用.NET创建的程序或组件时,元数据(metadata)和代码(code)都存储于“自成一体”的单元中,这个单元称为装配件.我们可以在程序运行期间访问这些信息. 在System.Reflectio ...
- C#基础|初探反射
什么是反射 我们编写的C#代码都可以编译成exe文件或dll文件.暂时先把他们叫做程序集吧,程序集中包含了很多信息.你写了一个类,类中会有字段,有属性,有方法,编译是会把这些信息保存在程序集中,暂时把 ...
- 转:.NET基础篇——反射的奥妙
反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等程序集内部的信息.使用反射可以看到一个程序集内部的接口.类.方法.字段.属性.特性等等信息.在System.Reflectio ...
随机推荐
- ps 换图片的背景颜色
先把图像格式换乘RGB然后调整颜色,不用谢我是活雷锋!www.idouly.com
- 宏定义中使用do{}while(0)的好处 (转载)
宏定义中使用do{}while(0)的好处 #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定 ...
- [Leetcode] Merge Sorted Array (C++)
我在Github上新建了一个解答Leetcode问题的Project, 大家可以参考, 目前是Java 为主,里面有leetcode上的题目,解答,还有一些基本的单元测试,方便大家起步. 题目: Gi ...
- VC中窗口ID,句柄,指针三者相互转换函数【转】
ID--HANDLE--HWND三者之间的互相转换id->句柄 hWnd = ::GetDlgItem(hParentWnd,id);id->指针 CWnd:: ...
- 【劳动节江南白衣Calvin 】我的后端开发书架2015
自从技术书的书架设定为”床底下“之后,又多了很多买书的空间.中国什么都贵,就是书便宜. 不定期更新,在碎片化的阅读下难免错评. 书架主要针对Java后端开发,书单更偏爱那些能用简短流畅的话,把少壮不努 ...
- Windows Server 2003 SP2企业版ISO下载, windows2003系统下载,2003系统下载,2003系统
Windows Server 2003 SP2 企业版ISO下载(真正企业免激活版) 此版本适合作为一个新系统来安装,也适合在虚拟机中安装 点评:Windows Server 2003 SP2 企业版 ...
- 【7】使用css/js/html模板来实现一个注册、登录和管理的功能
分支:auth static添加文件 css文件夹: app.css 自定义css样式[*] bootstrap.min.cs bootstrap样式 compomemts文件夹: 插件用 ...
- 写下你的第一个Django应用,第三部分
这篇指南开始于指南2结束的地方.我们将继续web投票应用和集中注意力在创建公共接口——“view” 理念 一个视图在你的Django应用中一个web页面的“品种”和它通常作为一个特定的函数以及有一个特 ...
- js+jquery+html实现在三种不通的情况下,点击图片放大的效果
js+jquery+html实现在三种不通的情况下,点击图片放大的效果. 三种情况分别是:图片的父元素宽高固定; 图片的宽高固定; 图片的父元素宽固定,高度不固定 第一种情况:图片的父元素宽高固定 ...
- sourceforge软件下载方式
访问http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/ 根据软件名称在文件列表中查找