前两篇文章都是提到了使用反射去解决一些问题,虽然尝试了想工作流中加入反射,但是尝试失败了,果然还是理解的不够深刻,所以去河大之前顺便也学了学反射到底是一个什么机制。
别看我们大话设计模式上说的那么玄乎,其实反射的机制是搜索,还记得我们在抽象工厂里面是怎么用的反射吗?
IUser iuser=Assembly.Load("DAL").CreateInstance("DAL.UserDAO")
应该是这样的吧,好像看起来都是一样的东西,但是我说这个反射就是个搜索机制,看我给你们翻译。
在DAL中搜索DAL.UserDAO这个类,然后创建一个对象,指向iuser。我们习惯把命名空间和程序集名称写成一样的,但是万一存在多个命名空间怎么办,所以还是把要搞懂命名空间和程序集的关系。程序集一般是我们的dll文件,程序集名称就是dll文件名,那么上边的Load方法的意义就是加载这个程序集。而后面的命名空间名.类名是在已经加载的程序集中搜索,然后创建一个对象。
那么问题来了,反射真的只有这一种用法吗?当然不是啦,使用反射的的意义在于后期绑定和灵活的修改,而我们每一个类型都有一个最基本的父类,叫做Object,也就是说如果我们使用反射创建对象,甚至不需要声明这个对象到底是什么类型的。
下面是一段MSDN的代码,就是使用这种Object作为类型的创建。
namespace ConsoleApplication2
{
public class Example
{
private int factor;
public Example(int f)
{
factor = f;
}
public int SampleMethod(int x)
{
Console.WriteLine("\nExample.SampleMethod({0}) executes.", x);
return x * factor;
}
public static void Main()
{
//获取当前执行代码的程序集
Assembly assem = Assembly.GetExecutingAssembly();
Console.WriteLine("Assembly Full Name:");
Console.WriteLine(assem.FullName);
// The AssemblyName type can be used to parse the full name.
AssemblyName assemName = assem.GetName();
Console.WriteLine("\nName: {0}", assemName.Name);
Console.WriteLine("Version: {0}.{1}",
assemName.Version.Major, assemName.Version.Minor);
Console.WriteLine("\nAssembly CodeBase:");
Console.WriteLine(assem.CodeBase);
// 从程序集众创建一个Example实例并且用object类型的引用o指向它,同时调用一个输入参数的构造函数
Object o = assem.CreateInstance("ConsoleApplication2.Example", false,
BindingFlags.ExactBinding,
null, new Object[] { 2 }, null, null);
//构造Example类的一个晚绑定的方法SampleMethod
MethodInfo m = assem.GetType("ConsoleApplication2.Example").GetMethod("SampleMethod");
//调用刚才实例化好的Example对象o中的SampleMethod方法,传入的参数为42
Object ret = m.Invoke(o, new Object[] { 42 });
Console.WriteLine("SampleMethod returned {0}.", ret);
Console.WriteLine("\nAssembly entry point:");
Console.WriteLine(assem.EntryPoint);
}
}
}
虽然在gettype的时候还是写出了这个类的名字,但是如果我们把那个参数用配置文件来传呢?这样就可以随便的创建对象了,甚至这样创建了对象之后,要使用的方法也能使用配置文件来使用。
上面的代码中有一个GetMethod的方法,而我们看到保存这个信息的是一个叫做MethodInfo的类型的对象,这个类中的信息是所有关于方法的信息,怎么说呢?我们的思路是面向对象的思路,而属性方法都是属于一个类的,那么描述这个属性方法的数据是不是也能抽象成一个类呢?看英文的意思应该就知道了,MethodInfo(方法信息),但是反射不仅仅能获得方法信息,属性,特性,所有关于描述这个类的信息都能获得。而这种数据就是元数据。
所以我们看到百度或是哪写的,反射是获得数据的元数据。
这个时候我就想到怎么能用到工作流中,虽然没有什么太具体的想法,工作流的原理是在工作流的代码中调用传入的委托方法,然后根据传入的页面URL跳转,那么如果使用反射创建一个工作流的对象,并且把这些信息都赋给这个对象,是不是可以实现动态配置呢?
研究就这些了,等我能做出结果再写一篇- -
以上