时间:2021-05-20
在实际的工作中直接使用反射的机会比较少,有印象的就是一次自己做的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);
}
}
}
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C#反射(Reflection)反射指程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集
在很久之前,我写了一片文章详解C#匿名对象(匿名类型)、var、动态类型dynamic,可以借鉴。因为那时候是心中想当然的认为只有反射能够在运行时解析对象的成员
C#高效反射调用方法类1.创建一个业务类(HomeService),在类下创建3个方法2.正常方式调用类的方法3.反射方式调用类的方法4.调用代码5.调用结果6
反射调用返回复杂对象的.NET方法定义数据接口上一篇在C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序
1、在C#中,class的变量为引用类型,在C++中class的变量为值类型,如myclassmc,在C++中,mc是值类型,成员存储在程序的栈区,在C#中,m