c#使用反射调用类型成员示例

时间:2023-02-27 08:54:43 

在实际的工作中直接使用反射的机会比较少,有印象的就是一次自己做的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);
}
}
}

标签:反射调用
0
投稿

猜你喜欢

  • C#与java TCP通道加密通信实例

    2023-12-03 15:44:29
  • java调用python脚本引入第三方库失败的实现

    2021-10-16 02:36:25
  • C#滚动字幕的实现方法

    2022-05-27 04:32:31
  • Java如何通过枚举实现有限状态机

    2021-08-05 04:21:05
  • 详解Java 集合系列(三)—— LinkedList

    2022-01-30 16:49:10
  • c# 实现获取汉字十六进制Unicode编码字符串的实例

    2023-03-21 11:22:35
  • Android绘制机器人小实例

    2022-12-04 00:12:42
  • java GUI实现学生图书管理简单实例

    2023-11-11 05:00:05
  • Android中handler使用浅析

    2022-08-22 23:45:16
  • Java8新特性Stream流实例详解

    2023-05-04 12:55:05
  • idea激活ActivateJrebel热部署的方法详解

    2023-04-05 17:54:42
  • C#中 MessageBox的使用技巧

    2023-06-25 16:15:48
  • 详解Java编程中包package的内容与包对象的规范

    2022-03-06 17:48:08
  • Java ClassLoader虚拟类实现代码热替换的示例代码

    2022-06-25 03:08:52
  • C#多维数组学习使用

    2023-07-06 11:51:02
  • 一篇文章彻底搞清楚c#中的委托与事件

    2021-09-07 02:24:03
  • 实例分析Android中HandlerThread线程用法

    2022-05-25 23:34:13
  • spring MVC中接口参数解析的过程详解

    2023-11-28 09:17:50
  • Android Studio设置或修改Android SDK路径方法

    2023-11-07 17:22:10
  • 简单了解JavaBean作用及常用操作

    2023-09-08 19:59:29
  • asp之家 软件编程 m.aspxhome.com