zoukankan      html  css  js  c++  java
  • [译]反射(Reflection)和动态(dynamic)

    反射
     
    当我们需要检查,调用一个程序集的内容的时候,用反射,比如,当VS给智能提示的时候,就应用了反射。
     
    简单用法实例:
    var myAssembly = Assembly.LoadFile(@"C:\ClassLibrary1.dll");
    var myType = myAssembly.GetType("ClassLibrary1.Class1");
    dynamic objMyClass = Activator.CreateInstance(myType);
    // 获取类的类型信息
    Type parameterType = objMyClass.GetType();
     
     
    // 浏览方法
    foreach (MemberInfo objMemberInfo in parameterType.GetMembers())
    {Console.WriteLine(objMemberInfo.Name);}
    
    // 浏览属性.
    foreach (PropertyInfo objPropertyInfo in parameterType.GetProperties())
    {Console.WriteLine(objPropertyInfo.Name);}
     
    //开始调用
    parameterType.InvokeMember("Display",BindingFlags.Public | 
    BindingFlags.NonPublic | BindingFlags.InvokeMethod | 
    BindingFlags.Instance,null, objMyClass, null);
     
     
    实际一点的用处呢:
    1.当你也要开发一个类似VS的编辑器的时候,要提供智能提示就需要反射
    2.当创建单元测试框架的时候,为了测试需要动态调用方法和属性的时候
    3.有时候我们想把类型的属性,方法等全部导出的时候
     
     
    动态dynamic
    编程语言分为强/弱类型,dynamic是弱类型,此关键字会让编译器不做编译时的类型检查,只做运行时的检查。
     
    dynamic x = "c#";
    x++;
    所以上面这行代码可以编译通过,但会产生运行时一场。
     
    实际用处:
    最多的就是通过互操作来操作Office组件的时候了
    没有dynamic的时候
    / Before the introduction of dynamic.
    Application excelApplication = new  Application();
    ((Excel.Range)excelApp.Cells[1, 1]).Value2 = "Name";
    Excel.Range range2008 = (Excel.Range)excelApp.Cells[1, 1];
    有了dynamic之后世界就不一样了
    dynamic excelApp = new Application();
    excelApp.Cells[1, 1].Value = "Name";
    Excel.Range range2010 = excelApp.Cells[1, 1];
     
    两者的区别和联系呢
     
    1.当我们想要在运行时操作一个对象的时候,就会用到这两个
    2.反射可以用来检测对象的元数据,也能在运行时调用对象的方法和属性
    3.dynamic是.net 4.0新出的关键字,知道方法被调用的时候,编译器才会晓得这个方法到底有还是没有。
    4.dynamic内部是使用反射来实现的,它缓存了方法调用来提高性能
    5.反射可以调用公有和私有成员,而dynamic智能调用用公有成员
    6.dynamic是实例相关的,无法访问静态成员,这种情况下使用反射吧。
     
     
      Reflection Dynamic
    Inspect (meta-data)  Yes  No 
    Invoke public members Yes Yes
    Invoke private members Yes No
    Caching No Yes
    Static class   Yes  No 

    再来一张图...
     
     
  • 相关阅读:
    [置顶] 礼物:《红孩儿引擎内功心法修练与Cocos2dx》之结点系统(场景,层,精灵)
    略读六部计算机名著
    #Sam有话说#AI OR AXURE
    Android 鲜为人知的 8 个小秘密
    iphone下来电实现铃声静音
    mac下的svn工具——Versions使用详解
    android下面res目录使用
    状态压缩DP 题目小节 (一)
    [置顶] 【游戏产业的5年之变】
    /usr/bin/ld: cannot find lxxx问题总结
  • 原文地址:https://www.cnblogs.com/lazycoding/p/3100932.html
Copyright © 2011-2022 走看看