现在的位置: 首页 > 综合 > 正文

反射笔记

2012年03月15日 ⁄ 综合 ⁄ 共 2107字 ⁄ 字号 评论关闭

反射概念

   反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。

练习代码

一个Apple类

Apple 类

namespace Arithmetic
{
public class Apple
{
public void SayApple()
{
Console.WriteLine(
"Hi Apple!");
}
}
}

一个Program类

Program 类

namespace Arithmetic
{
class Program
{
static void Main(string[] args)
{

}
}
}

一个Common类库

  练习将使用反射动态实例化一个Apple类,调用Apple里的方法和加载外部程序集并调用其中的方法。本随笔只是做为练习反射的一个记录,并不是实际应用,对于反射实际应用应该根据自己的具体环境来。

  首先需要先获取当前执行的程序集

  //加载当前执行的程序集
Assembly assembly = Assembly.GetExecutingAssembly();

  然后获取该程序集下定义的类型,可以直接获取该类或获取全部类,然后再找出自己需要的类。然后实例化

View Code

//直接获取apple类 名称必须是全名 命名空间+类名
//Type type = assembly.GetType("");

//获取所有程序集下定义的类
Type[] types = assembly.GetTypes();
Apple apple
= null;

foreach (Type t in types)
{
if (t.Name == "Apple")
{
//实例化
apple = (Apple)assembly.CreateInstance(t.FullName);
//调用实例化后的方法
apple.SayApple();
}
}

  反射调用方法

View Code

//反射调用方法
MethodInfo m = assembly.GetType("Arithmetic.Apple").GetMethod("SayApple");
m.Invoke(apple,
null);

  上面反射是调用同一个程序集里面的东西,如果是不同的程序集,那需要先加载外部的程序集

View Code

//加载外部程序集
Assembly commonAssembly = Assembly.Load("Common");
//string path = System.IO.Path.Combine(Environment.CurrentDirectory, "Common.dll");
//Assembly commonAssembly = Assembly.LoadFrom(path);
Console.WriteLine("被加载程序集全名:{0}", commonAssembly.FullName);

  当加载完成后,反射实例、方法同上面一样

View Code

//反射调用方法
object obj = commonAssembly.CreateInstance("Common.Utility.RegexHelper");
MethodInfo commonMethod
= obj.GetType().GetMethod("IsChineseCharacters");
object result = commonMethod.Invoke(obj, new object[] {"1"});
Console.WriteLine(result);

  一个简单的分析Common程序集的代码

View Code

//反射调用方法
object obj = commonAssembly.CreateInstance("Common.Utility.RegexHelper");
MethodInfo commonMethod
= obj.GetType().GetMethod("IsChineseCharacters");
object result = commonMethod.Invoke(obj, new object[] {"1"});
Console.WriteLine(result);

Console.WriteLine(
"================分析反射加载程序集Common的内容================");
AssemblyName commonName
= commonAssembly.GetName();

Console.WriteLine(commonName.Name);
Type[] commonTypes
= commonAssembly.GetTypes();

for (int i = 0; i < commonTypes.Length; i++)
{
Type t
= commonTypes[i];
Console.WriteLine(
"┄{0}", t.Namespace);
Console.WriteLine(
"┄┄{0}", t.Name);

foreach (MethodInfo item in t.GetMethods())
{
Console.WriteLine(
"┄┄┄{0}", item.Name);
}
}

  

  关于反射更详细的内容可以参考MSDN。

抱歉!评论已关闭.