反射中使用 BindingFlags.IgnoreCase
2015-11-10 10:06
316 查看
我们经常需要通过反射来调用目标对象的方法或获取/设置目标对象的属性,Type.InvokeMember 方法签名如下:
public object InvokeMember(string name,BindingFlags invokeAttr,Binder binder, object target,object[] args,CultureInfo culture);
BindingFlags 有个枚举值是BindingFlags.IgnoreCase ,表示忽略name的大小。我在今天解决一个问题时,就需要用到BindingFlags.IgnoreCase。问题是这样的,我想根据数据库列的列名来通过反射从Entity对象中获取对应的属性值,大家知道,从Oracle数据库提取的列名全是大写的,而Entity中的属性名是使用的Pascal命名方法,如果不忽略属性名的大小写,则反射会失败。
于是我像下面的方式获取属性:
t.InvokeMember(para.SourceColumn , BindingFlags.IgnoreCase |BindingFlags.GetProperty ,null ,obj ,null) ;
可是反射失败了!经过一段时间的尝试,终于发现BindingFlags.IgnoreCase 需要与BindingFlags.Public和BindingFlags.Instance联用才会产生效果。
t.InvokeMember(para.SourceColumn , BindingFlags.Public |BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.GetProperty ,null ,obj ,null) ;
如此,则可以忽略大小写来获取属性值了。
public object InvokeMember(string name,BindingFlags invokeAttr,Binder binder, object target,object[] args,CultureInfo culture);
BindingFlags 有个枚举值是BindingFlags.IgnoreCase ,表示忽略name的大小。我在今天解决一个问题时,就需要用到BindingFlags.IgnoreCase。问题是这样的,我想根据数据库列的列名来通过反射从Entity对象中获取对应的属性值,大家知道,从Oracle数据库提取的列名全是大写的,而Entity中的属性名是使用的Pascal命名方法,如果不忽略属性名的大小写,则反射会失败。
于是我像下面的方式获取属性:
t.InvokeMember(para.SourceColumn , BindingFlags.IgnoreCase |BindingFlags.GetProperty ,null ,obj ,null) ;
可是反射失败了!经过一段时间的尝试,终于发现BindingFlags.IgnoreCase 需要与BindingFlags.Public和BindingFlags.Instance联用才会产生效果。
t.InvokeMember(para.SourceColumn , BindingFlags.Public |BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.GetProperty ,null ,obj ,null) ;
如此,则可以忽略大小写来获取属性值了。
相关文章推荐
- winfrom 安装包制作之添加ico图片
- 在FlowDocument中设置TableCell垂直居中遇到的问题
- ScrollView为根布局,无法从顶部开始显示
- 部分博客中的代码已放到了GitHub上,欢迎大家下载阅读!
- 连接数据库语法
- 如何将图片插入数据库
- 转:iOS9的新特性以及适配方案
- 基于GitLab的前端Assets发布体系
- 分享:Android之自定义标题
- Oracle显示游标的使用及游标for循环
- DRBD
- My Network programming library
- Spring利用JDBCTemplate实现批量插入和返回id
- 【Leetcode】之Merge Two Sorted Lists
- 分享大数据视频教程
- jquery中attr和prop的区别分析
- Android Bundle类
- JAVA异常处理机制
- Sublime Text快捷键和使用技巧
- 王总QQ聊天对话