zoukankan      html  css  js  c++  java
  • 【原创】反射应用一InvokeMember

    反射是.net中的高级功能之一,利用反射可以动态的实例化类的对象,并且可以调用其方法及成员属性。所以学习好反射是很重要的。今天我就写一写简单的反射实现InvokeMember

    至于关于这个函数,可以去MSDN上去查看。我只说一些和实际开发中的一些小例子。

    本例子要点:如何利用InvokeMember动态实例化一个类,并且去调用类内部的方法及成员属性

    讲解如下:

    (1)首先我先建立一个类库,在类库里面建立一个类,供我一会利用反射动态调用,代码如下

     1   public class TestCustomerAttr
     2     {
     3         private string name;
     4 
     5         public string Name
     6         {
     7             get { return name; }
     8             set { name = value; }
     9         }
    10         public  string getName()
    11         {
    12             return "name";
    13         }
    14         public string getNameS(string msg)
    15         {
    16             return msg;
    17         }
    18 
    19         public static string getSName()
    20         {
    21             return "static Name";
    22         }
    23   
    24 
    25 
    26     }

    (2)通过AppDomain.CurrentDomain.CreateInstanceAndUnwrap()方法动态实例化一个类的实例,代码如下:

     1                 //通过AppDomain.CurrentDomain.CreateInstanceAndUnwrap()方法动态实例化一个类
     2                 object obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.TestCustomerAttr");
     3                 //获得对象实例的类型
     4                 Type type = obj.GetType();
     5 
     6                 
     7                 object result = type.InvokeMember(
     8                     "getSName",   //调用的方法
     9                     BindingFlags.InvokeMethod, //使用BindingFlags.InvokeMethod枚举
    10                     null, //设为空即可
    11                     obj, //调用方法的对象
    12                     null //调用方法的参数           
    13                 );

    注意:这个是调用无参数的方法,如果有参数又该如何调用呢。代码如下:

     1              //通过AppDomain.CurrentDomain.CreateInstanceAndUnwrap()方法动态实例化一个类
     2                 object obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.TestCustomerAttr");
     3                 //获得对象实例的类型
     4                 Type type = obj.GetType();
     5 
     6                 
     7                 object result = type.InvokeMember(
     8                     "getNameS",   //调用的方法
     9                     BindingFlags.InvokeMethod, //使用BindingFlags.InvokeMethod枚举
    10                     null, //设为空即可
    11                     obj, //调用方法的对象
    12                     new string[]{"我是带参数的方法"} //调用方法的参数           
    13                 );

    另外:动态实例化一个类的时候还可以用另外的一种方法,如下:

     1 也可以用
     2    string typeName = typeof(TestCustomerAttr).AssemblyQualifiedName;
     3     Type type = Type.GetType(typeName);
     4 
     5 代替
     6 
     7                 object obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.TestCustomerAttr");
     8                 Type type = obj.GetType();
     9 
    10  不过,第一种方法只适合调用静态方法

    (3)动态调用类内部的成员属性,代码如下:

     1  object obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.TestCustomerAttr");
     2                 Type type = obj.GetType();
     3 
     4 
     5                             type.InvokeMember(
     6                     "Name",   //调用的方法
     7                     BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.SetProperty, //使用BindingFlags.InvokeMethod枚举
     8                     null, //设为空即可
     9                     obj, //调用方法的对象
    10                     new string[] { "aaa" } //调用方法的参数
    11                 );
    12 
    13                 TestCustomerAttr t = (TestCustomerAttr)obj;
    14                 Response.Write(t.Name);      

    代码完毕。

     转载的请注原创地址,谢谢。

  • 相关阅读:
    js根据年份获取某月份有几天
    java 时间转换去杠
    简单Maven Dos命令语句
    Maven命令参数
    Redis学习推荐
    Java中Redis缓存
    oracle新建登录用户sql语句
    ORacle修改表列长度
    jsp利用application统计在线人数的方法
    Oracle之分页查询
  • 原文地址:https://www.cnblogs.com/yxhblog/p/2537006.html
Copyright © 2011-2022 走看看