.NET反射实例
在上篇《程序集和反射(一)》中,我们重点讲解了“程序集”和反射的基本概念,原理等。有的读者可能会认为这些枯燥的理论没啥用,其实不然。据我的经历,面试中问到的很多。能够透彻的理解“程序集,反射等”,而且能在日常开发中灵活的运用反射,是一个优秀的.NET开发人员的重要参考标准。呵呵。
本节中,我将通过具体的实例。教大家如何在)C#).NET开发中使用反射。
首先,我新建一个普通的类库项目。在该项目的测试类中,定义好 属性、静态方法、实例方法、无参方法等... 代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ReflectorTest
{
class Test
{
private string name;
public string Name { get; set; }
/// <summary>
/// 静态方法
/// </summary>
/// <returns></returns>
public static string staticMethod(string name)
{
return name;
}
/// <summary>
/// 实例方法
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public string sayHello(string name)
{
return "hello:" + name;
}
/// <summary>
/// 无参的方法
/// </summary>
/// <returns></returns>
public string noParm()
{
return "I'M A noParm Method";
}
}
}
上面的类库项目,编译通过后,会生成一个DLL文件。好的,我们就是要通过“反射”技术,来尝试着看看这个DLL里面包含的相关元素信息,做一些模拟的操作等。
有点类似于“反编译”吧?呵呵。其实著名的Reflector.NET反编译工具,就是利用反射的原理。还有Microsoft Visual Studio 中的调试,背后也是利用反射技术..
具体的使用代码如下(都有详细的使用说明,注释。读者可以一目了然):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
// reflectorInfo();
reflectorDemo();
Console.ReadKey();
}
/// <summary>
/// 利用反射去调用程序集中(包含的类)所包含的方法,属性,成员...
/// </summary>
public static void reflectorDemo()
{
Assembly ass;
Type type;
MethodInfo method;
try
{
ass = Assembly.LoadFile(@"F:\Projects\ReflectorTest\ReflectorTest\bin\Debug\ReflectorTest.DLL");//根据物理DLL路径尝试加载
type = ass.GetType("ReflectorTest.Test");//根据类型名称,反射出该类型(注意格式是:“命名空间.类名”)
object o =Activator.CreateInstance(type);//创建该类型的对象实例
method=type.GetMethod("sayHello");//反射获取方法(实例方法)
string s = (string)method.Invoke(o,new string[] {"dinglang"});//调用实例方法
Console.WriteLine("调用实例方法返回:"+s);
method=type.GetMethod("noParm");//无参方法
s= (string) method.Invoke(o,null);//调用无参函数
Console.WriteLine("调用无参方法返回:"+s);
//type.GetProperties()//获取该类型下面的所有公共属性
method=type.GetMethod("staticMethod");//静态函数
s=(string)method.Invoke(null,new string[]{"dinglang"});//调用静态方法
Console.WriteLine("调用静态方法返回:"+s);
//根据指定的属性名称,获得属性值
补充:Web开发 , ASP.Net ,