码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-05 10:48:13      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

  

我初步的理解:反射就是动态调用(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下)

标签:

原文地址:http://www.cnblogs.com/yffswyf/p/4193226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!