zoukankan      html  css  js  c++  java
  • 反射的一些用法(WP8.1下)

      

    我初步的理解:反射就是动态调用(dll)类。

    比如某个dll有一个类,通过反射就可以知道它里面属性、方法,就可以实现调用。

     确实,dll可以直接引用,但是如果遇到这种情况:

    添加、删除功能同属一个Dll,要在源程序代码不变的情况下,增加新功能,就要动态加载程序集。 

    1.反射获取类型

      a.对于普通的类:

      

    Type t = Type.GetType("TestReflect.Class1");  //typeName = 命名空间+类名
    
    //或者根据类是实例来获取: Class1 obj = new Class1();    Type t = typeof(Class1);

      b.Dll等装配件:

      

    Assembly assembly = Assembly.Load(new AssemblyName() { Name = "PhoneClassLibrary1" });  
    
    //加载程序集  Name为引用的Dll的标识(属性中查看)
    
    //Load() 只需程序集名称;   LoadFrom()   需要完整路径名
    
    Type t = assembly.GetType("PhoneClassLibrary1.TestClass");  //命名空间+类名

    2.创建实例

      

    object[] args = new object[] {"arg1", "arg2"}; //带两个参数(构造函数的重载)    ;  new object[] {} 为不带参数  调用默认构造函数
    
    Class1 obj = (Class1)Activator.CreateInstance(t,args);

    3.获取方法

      a.获取单个方法(注意:此方法只能访问Public型)

      

    MethodInfo method = t.GetRuntimeMethod("MethodName", new Type[] { typeof(string) });  //MethodName:方法名   后者为方法的参数  
    //MethodInfo method = t.GetRuntimeMethod("MethodName",new Type[]{});  //此为无参方法的获取
    if (method != null)
      method.Invoke(obj, new object[] { "hello" });  
      //method.Invoke(obj, null);  //无参数方法的调用
    

      b.获取访问修饰符为private等方法

      //若要访问 Private  必须获取方法集合

    var list = t.GetRuntimeMethods();             
    foreach (var item in list)
    {                               
      if (item.IsPrivate)   //判断是否为Private              
      {                     
        item.Invoke(obj, new object[] { }); //或者item.Invoke(obj, null);
        //为静态方法时,obj可为null                 
      }                
      else if (item.Name.Equals("OtherMethod"))                 
      {
        var back = item.Invoke(obj, new object[] { "传入的值" });
      } }

    4.当然,除了获取到方法之外,还能够获取字段(GetRuntimeField) 

    属性(GetRuntimeProperty)、事件(GetRuntimeEvent)等。这里就不详述了。

  • 相关阅读:
    获取某年某月有几天
    ps怎么修改gif动图播放速度
    Swing滚动条重写
    Swing自定义JScrollPane的滚动条设置,重写BasicScrollBarUI方法
    你真的了解UIButton、UILabel 吗?
    问题:-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "BlueView" nib but the view outlet was not set.
    李洪强漫谈iOS开发[C语言-043]-练习
    iOS开发基础知识--碎片46
    iOS开发基础知识--碎片45
    iOS开发基础知识--碎片44
  • 原文地址:https://www.cnblogs.com/yffswyf/p/4193226.html
Copyright © 2011-2022 走看看