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

摘要:
在实际工作中,很少有机会直接使用反射。我的印象是,我自己制作的WinForms小部件使用反射来动态获取表单上的每个控件,并为必要的控件动态添加注册事件。在该项目中,我们使用NHibernate作为ORM框架。通常,在BLL层中提供了相应的排序方法,但需要修改的bug使用的数据不在表中,而是在视图中。与同事沟通后,我决定使用反思。

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

免责声明:文章转载自《c#使用反射调用类型成员示例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mockito (一).NET 环境中使用RabbitMQ(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Vue + Element UI 实现权限管理系统 前端篇(十):动态加载菜单

动态加载菜单 之前的 导航树 是写死的,实际应用中需要从后台服务器获取菜单数据之后动态生成。 之前的mock已经准备好了模拟数据 接口模块化 之前说过,当接口变多时,放在一个 interface.js 中不方便维护。 现在改名为 api.js 作为集合文件,将里面的 相关接口 都转入新的文件夹 modules 里面。  模块化之后,模块接口写在相应的模块...

函数中的动态参数

所谓的动态参数就是在写函数时,你可以传递1个参数,2个参数,3个参数甚至更多,同时也可以忽略它。 动态参数:一般有两种表示方法: *args 和**kwargs ,它的区别不是在于 args 和kwargs 这里可以替换成任意字母,这里最主要的区别是* 和** 动态参数跟默认参数一样,要写在位置参数的后面 def func(name,age,sex,cla...

解决在 CSS 中,如何实现动态吸顶的样式/效果 ?

解决方法:使用 position: sticky 做了一个动态吸顶的效果: 举例如下: 1 未向上滚动页面之前: 2 向上滚动页面之后: 这样, “This is tab main”部分的元素,可以一直保持在页面窗口的顶部。 3 具体代码:这个使用的代码其实就是 position: sticky, top: xx (阀值)来实现的: 给想要实现吸顶效果的...

下载Tomcat时Tomcat网站上的core和deployer的区别

下载Tomcat时Tomcat网站上的core和deployer的区别  做JavaEE开发的朋友,无论是学习者还是已经工作的朋友,总是会用到Tomcat这个Servlet容器,那么大家从Tomcat官网上去下载tomcat的时候总会看到下载列表中有如下内容(下面以下载6.0.43版为例): 6.0.43 Please see the README fil...

js中动态载入css js样式

js中动态载入css样式,方法如下: //<link rel="stylesheet" type="text/css" href="http://t.zoukankan.com/http://css.static.m1905.cn/base.min.css"> var addCssLink =function(url){ var lin...

C#给ExpandoObject动态添加对象

C#给ExpandoObject动态添加属性 C#给ExpandoObject动态添加对象: 方法一: dynamic x = new ExpandoObject();x.NewProp = string.Empty; 方法二: var x = new ExpandoObject() as IDictionary<string, Object>...