Reflection
一、定义
反射主要基于System.Assembly类与System.Type类,通过调用方法来获取某一个程序集的相关信息。如类、接口、方法等信息。例如有时候你不知道一个DLL文件里面不知道是个什么东西,你就可以通过Type或者Assembly来调取里面的信息。
二、方法
Assembly 类的常用属性
公共属性 | 说明 |
EntryPoint | 获取此程序集 的入口点 |
FullName | 获取此程序集的显示的名称 |
Location | 获取包含清单已加载文件的路径或位置 |
MainifestModule | 获取包含当前程序集清单模块 |
Assembly 类的常用方法
方法 | 说明 |
GetFiles | 获取程序集清单文件表中的文件 |
GetModule | 获取此程序集的指定模块 |
GetModules | 获取作为此程序集的一部分的所有模块 |
GetType | 获取表示类型的Type对象 |
LoadFile | 加载文件的内容 |
LoadFrom | 在已知程序集的文件名或路径等信息加载时加载程序集 |
LoadModule | 加载次程序集的内部模块 |
反射空间所包含的类
Assembly类: 通过它可以找到大量的隐藏在在程序集的身份中的信息,如版本信息,区域信息等
ConstructourInfo 类: 用于发现构造函数及调用构造函数。通过Constructors或GetConstructor方法返回
EventInfo 类 :通过它可以找到事件的信息
FieldInfo类:通过它可以找到字段的信息
MethodInfo类:通过它可以找到方法的信息
ParameterInfo类:通过它可以找到参数信息
PropertryInfo类:通过它找到属性的信息
MemberInfo类:它是一个抽象基类,为EventInfo、FieldInfo、MethodInfo、PropertyInfo等类型定义了公共的行为
Module 类:用来访问带有多文件程序集的给定的程序模块
DefaultMemberAttribute类:定义某类型的成员该成员时InvokeMember使用时的默认成员
Type类的常用属性
公共属性 | 说明 |
IsAbstract | 获取一个值,通过该值指示Type是否为抽象的并且必须被重写 |
IsArray | 获取一个值,通过该值指示Type是否为数组 |
IsByref | 获取一个值,通过该值指示Type是否为引用传递 |
Isclass | 获取一个值,通过该值指示Type是否为一个类,即不是指类型或接口 |
IsInterFace | 获取一个值,通过该值指示Type是否为一个接口,即不是值类型或类 |
IsSubclassof | 确定当前的Type表示的类是不是从指定的Type表示的类派生的 |
MakeArrayType | 返回一个表示当前类型的一维数组(下限为零)Type的对象 |
Module | 获取当前Type定义的模块 |
Name | 获取当前成员的名称 |
Namespace | 获取Type的命名空间 |
Reflected | 获取用于该成员的类对象 |
Type类的常用方法
方法 | 说明 |
GetElementType | 当在派生类中重写时,返回当前的数组、指针或引用类型包含的对象的Type |
GetEvent | 获取由当前的Type声明或继承的特定的事件 |
GetEvents | 获取当前的Type声明或继承的特定的事件 |
GetField | 获取当前的Type的特定字段 |
GetFields | 获取当前的Type的字段 |
GetInterface | 获取当前的Type继承或声明的特定接口 |
GetInterfaces | 获取当前Type继承或声明的接口 |
GetMember | 获取当前的Type的指定成员 |
GetMembers | 获取当前的Type 的成员 |
GetMethod | 获取当前的Type的指定方法 |
GetMethods | 获取当前Type的方法 |
GetPropertries | 获取当前Type的属性 |
GetPropertry | 获取当前的Type的特定属性 |
InvokeMember | 使用指定的绑定约束匹配指定的参数列表,调用指定成员 |
三、实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using myns = System.Math;
using System.Data;
using System.Collections;
using System.Reflection;
namespace ConsoleApplication22
{
class Program
{
static void Main(string[] args)
{
string classname = "System.Object";
Console.WriteLine("{0}类",classname);
Type t=Type.GetType(classname);
MethodInfo[] m = t.GetMethods();
Console.WriteLine("{0}的方法个数{1}", t.FullName, m.Length);
foreach (MethodInfo item in m)
{
Console.WriteLine("\t{0}", item.Name);
}
FieldInfo[] f = t.GetFields();
Console.WriteLine("{0}字段的个数{1}", t.FullName, f.Length);
foreach (FieldInfo item in f)
{
Console.WriteLine("\t{0}", item.Name);
}
ConstructorInfo[] c = t.GetConstructors();
Console.WriteLine("{0}的构造函数个数{1}", t.FullName, c.Length);
foreach (ConstructorInfo item in c)
{
Console.WriteLine("\t{0}", item.Name);
}
Console.ReadKey();
}
}
}