首页 > 代码库 > 反射的一些用法(WP8.1下)

反射的一些用法(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)等。这里就不详述了。

反射的一些用法(WP8.1下)