对“反射”的深入认识,你会发觉跟“解剖”一样

本文详细介绍了.NET反射机制的工作原理,通过一个实际的例子展示了如何在运行时解析类库,获取类型成员信息,动态创建对象并调用其方法,揭示了反射在.NET编程中的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对很多人来说,对.Net的反射机制不甚了解,其实反射是一种很优秀的机制,知道了它,就可以把握很多程序的脉搏。如何这样说呢?首先,反射是这样定义的:可以在运行时根据所提供的类库(.dll)来进行解析以获得其中包含的类型(包含类、结构、委托、接口、枚举等)成员,进而获取到对应的方法、属性、事件以及构造函数等(甚至可获得对应的名称、限定符和参数)信息。有了这些信息,我们就可以动态的创建对象,即使在编译时不知道对象的类型也无所谓。打个比方:反射好比人体解剖,可以给一个完整的人(^^哈哈,当然是死人哈,这里类比一个.dll文件),通过解剖(反射)就可以获取对应的部位(成员),进而利用这些部位去做更多的事情(如利用DNA克隆)。是不是很神奇啊!下面我们以一个完整的例子来说明:

1. 首先建立一个类型库项目(Library),并添加一个类Person,生成一个类库程序集(Library.dll)。

namespace Library
{
public class Person
{
private string name;
private string sex;
private int age;

public Person() : this(null) { }
public Person(string name)
{
this.name = name;
}

public string Name
{
get { return name; }
set { name = value; }
}
public string Sex
{
get { return sex; }
set { sex = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}

public void Say()
{
if (name == null)
{
Console.WriteLine("Hello World");
}
else
{
Console.WriteLine("Hello " + name);
}
}
}
}

2. 再建立一个控制台(测试)项目Test,并将Library.dll拷贝到本项目的bin/debug目录下。特别注意的是,在此项目中必须添加System.Reflection。

using System.Reflection;
static void Main(string[] args)
{
Console.WriteLine("列出程序集Library.dll中的所有类型");
Assembly asm = Assembly.LoadFrom("Library.dll");
Type person = null;
Type[] types = asm.GetTypes();
foreach (Type t in types)
{
Console.WriteLine(t.Name);
if (t.Name == "Person")
{
person = t;
}
}
Console.WriteLine("列出类型Person的所有方法");
MethodInfo[] methods = person.GetMethods();
foreach (MethodInfo mi in methods)
{
Console.WriteLine(mi.Name);
}
Console.WriteLine("实例化类型Person并调用方法Say()");
object obj = Activator.CreateInstance(person);
object miracle = Activator.CreateInstance(person, "Miracle");
MethodInfo say = person.GetMethod("Say");
say.Invoke(obj, null);//输出Hello World
say.Invoke(miracle, null);//输出Hello Miracle
}

从以上两点就可以完整地看到反射的过程,类似于.NET的反编译机制(有兴趣的朋友可以去研究一下IDASM和Reflector工具)。

转载于:https://www.cnblogs.com/hmiinyu/archive/2011/11/10/2244828.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值