欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-25 17:27:21
在实际的工作中直接使用反射的机会比较少,有印象的就是一次自己做的winforms小工具的时候利用反射来动态获取窗体上的每个控件,并且为必要的控件动态添加注册事件。因为刚入职...

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