反射概念
反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。
练习代码
一个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。