博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【dynamic】简化反射简单尝试
阅读量:7032 次
发布时间:2019-06-28

本文共 1453 字,大约阅读时间需要 4 分钟。

原文地址:http://www.cnblogs.com/wupeng/p/3650199.html

 

最近在自己瞎整设计自己的数据访问层(纯属深入了解C#用),遇到了反射。网传反射性能很差,可是我们项目中也有功能用到了反射,总体来说还不错(小项目)。由于居安思危的感觉越发沉重,不得不去打破传统,去寻求可以替代反射,稍加提高性能的方式,于是乎就到了现在。

我最讨厌,什么看见别人用反射就说性能差,以一言以带过,去问他怎么优化,半天都不知所云(在项目中用反射的时候,很多同事都是这样)。如果是真正的大神都会先列出自己以前用到的反射,然后给出优化方案。

以下就是博客园最盛行的关于dynamic简化反射的文章

1,

2,

3,

4,

………………………………….

 

用自己的方式,稍加改动吧

大神说得好目前最常见的优化反射性能的方法就是采用委托:用委托的方式调用需要反射调用的方法(或者属性、字段)接下来就跟着大神走,构建委托吧

//通过dynamic获取对象中的字段 Func
DynamicGetter
() { return s => { dynamic d = s; return d.name; }; }//通过dynamic调用对象中的方法(此处是动态调用List内部Add方法) Action
DynamicGetter2
() { return t => { dynamic d = t; d.Add("str"); }; }

再来个需要用到的类

public class ProductEntity    {        public string name = "1234";        [DataField("nid")]        public string ProductNo { get; set; }        [DataField("pname")]        public string ProductName { get; set; }    }

接下来就是调用了

var s = DynamicGetter
();var sss = s(new ProductEntity());var t = DynamicGetter2
>();List
list = new List
();t(list);

dynamic理论:它是C#引入的新类型,它的特点是申明为dynamic类型的变量,不是在编译时候确定实际类型的, 而是在运行时。

所以我们构建 t => { dynamic d = t; d.Add("str"); }; 表达式的时候就不会报 "dynamic" 不包含 "Add()" 的定义,并找不到可接受类型为……的错误了

这样当到达了运行的时候,会动态的获取【t】的类型,去调用【t】中的Add方法。

因为dynamic类型要在运行时才去检测确定,所以很多错误无法在编译时重现,这样使用的时候就需要非常小心了。

下一篇:给自己的数据访问层的实体反射赋值

你可能感兴趣的文章
Ios 入门 ----WebView 控件
查看>>
scala编译错误
查看>>
VMware Horizon 6 介绍
查看>>
ansible的使用
查看>>
2012年2月10日
查看>>
Linux下Web服务器应用之网站安全-https
查看>>
关于循环嵌套循环
查看>>
Scala中常见的容器 Option(选项)
查看>>
算法-蛇型矩阵
查看>>
路由交换IOS的备份与还原
查看>>
05.swift ?可选类型
查看>>
JavaSE 学习参考:方法的参数
查看>>
跟小博老师一起学习MyBatis ——MyBatis搭建运行环境
查看>>
linux ***
查看>>
豆瓣网站为什么会选择python而不是ruby
查看>>
在腾讯云服务器上体验Docker
查看>>
OpenStack Rabbit 集群实现
查看>>
我的友情链接
查看>>
mysql存储过程
查看>>
DDD(领域驱动设计)jpatable主键生成策略RBAC打造通用WEB权限
查看>>