zoukankan      html  css  js  c++  java
  • c#使用反射调用类型成员示例

    在实际的工作中直接使用反射的机会比较少,有印象的就是一次自己做的WinForms小工具的时候利用反射来动态获取窗体上的每个控件,并且为必要的控件动态添加注册事件。因为刚入职新公司,为了更快的了解公司的业务、和开发习惯,先和现在公司同事一起修改现有系统的一些小Bug。在Tester提交的Bug中有一个是对GridView进行动态的排序——点击一个列时使用该列作为条件进行排序(PS:点击一个列时前台会将该列的字符串(该字符串是)传到后台的方法中)。

    使用反射的原因

    为什么会选择使用反射呢?在项目中我们使用NHibernate作为ORM框架,一般情况下在BLL层其实都提供了对应的排序方法,但是现在需要修改的这个Bug使用的数据不是在一张表里面,而是一个视图。如果按照以前排序功能实现模式的话,需要在多个地方进行修改;且由于是刚接触这个项目,对项目的结构还不够了解,不宜进行大面积的修改。和同事沟通后决定使用反射来实现。理由如下:

    因为是直接对已经从数据库返回的结果进行排序,所有只需要在一个地方修改(BLL层)
    虽然使用反射会增加性能上的开销,但是在这个场景数据量并不大,性能上的消耗可以忽略不计

    使用反射动态调用代码

    反射给人感觉好像很复杂,其实使用起来还是比较方便的,由于项目中代码上下文牵涉过多,不适合贴出来,下面是使用我自己整理的使用反射进行动态调用,常用的一些代码片段:

    复制代码代码如下:

    classProgram
    {
    staticvoidMain(string[]args)
    {
    Typetype=typeof(Employee);

    //使用无参构造函数动态创建对象
    varobjNull=type.InvokeMember(null,BindingFlags.CreateInstance,null,null,null);

    //调用两个使用了两个string参数的构造函数动态创建对象
    varfrankJob=type.InvokeMember(null,BindingFlags.CreateInstance,null,null,newobject[]{"job","frank"});

    //调用公有成员属性get方法
    varfileName=type.InvokeMember("FirstName",BindingFlags.GetProperty,null,frankJob,null);

    //调用公有成员属性set方法
    type.InvokeMember("Email",BindingFlags.SetProperty,null,frankJob,newobject[]{"gyzdfasddfsafhao@vervidian.com"});

    //动态调用无参数方法
    varobjStr=type.InvokeMember("ToString",BindingFlags.InvokeMethod|BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static,null,frankJob,null);

    //动态调用带参数的方法
    varemail=type.InvokeMember("GetEmail",BindingFlags.InvokeMethod,null,frankJob,newobject[]{"sunshine"});
    }

    publicclassEmployee
    {
    publicintId{get;set;}
    publicstringFirstName{get;set;}
    publicstringLastName{get;set;}
    publicstringAddress{get;set;}
    publicstringEmail{get;set;}

    publicEmployee(){}
    publicEmployee(stringfirstName,stringlastName)
    {
    FirstName=firstName;
    LastName=lastName;
    }

    publicoverridestringToString()
    {
    returnstring.Format("{0}{1}",LastName,FirstName);
    }

    publicstringGetEmail(stringuser)
    {
    returnstring.Format("{0}@gmail.com",user);
    }
    }
    }

  • 相关阅读:
    TRichView文档结构2
    Qtablewidget 复杂表头
    Qwt 使用mingw编译安装过程(windows):
    [转]为什么有的人工作多年还是老样子?
    软件公司书籍推荐——按角色划分
    Qt error: one or more PCH files were found, but they were invalid
    qt5.5程序打包发布以及依赖【转】
    Qt5.5.1编译出来的程序出现libgcc_s_dw2-1.dll的解决方案
    值得推荐的C/C++框架和库
    开发资源汇总
  • 原文地址:https://www.cnblogs.com/smilesmile/p/3790993.html
Copyright © 2011-2022 走看看