B\S备忘录10——普通的反射返回普通的一天

  前两篇文章都是提到了使用反射去解决一些问题,虽然尝试了想工作流中加入反射,但是尝试失败了,果然还是理解的不够深刻,所以去河大之前顺便也学了学反射到底是一个什么机制。

  别看我们大话设计模式上说的那么玄乎,其实反射的机制是搜索,还记得我们在抽象工厂里面是怎么用的反射吗?

  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跳转,那么如果使用反射创建一个工作流的对象,并且把这些信息都赋给这个对象,是不是可以实现动态配置呢?

  研究就这些了,等我能做出结果再写一篇- -

以上


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值