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

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

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

1,改善C#程序的建议2:C#中dynamic的正确用法

2,使用dynamic来简化反射实现

3,使用.NET4.0的dynamic实现反射

4,编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]

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

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

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

//通过dynamic获取对象中的字段
 Func<T, string> DynamicGetter<T>()
 {
      return s => { dynamic d = s; return d.name; };
 }

//通过dynamic调用对象中的方法(此处是动态调用List内部Add方法)
 Action<T> DynamicGetter2<T>()
 {
      return t => { dynamic d = t; d.Add("str"); };
 }

再来个需要用到的类

public class ProductEntity
    {
        ";

        [DataField("nid")]
        public string ProductNo { get; set; }

        [DataField("pname")]
        public string ProductName { get; set; }
    }

接下来就是调用了

var s = DynamicGetter<ProductEntity>();
var sss = s(new ProductEntity());

var t = DynamicGetter2<List<string>>();
List<string> list = new List<string>();
t(list);

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

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

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

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

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

【dynamic】简化反射简单尝试的更多相关文章

  1. 使用dynamic来简化反射实现

    dynamic是Framework4.0的新特性,dynamic的出现让C#具有了弱语言类型的特性,编译器在编译的时候,不再对类型进行检查,不会报错,但是运行时如果执行的是不存在的属性或者方法,运行程 ...

  2. 编写高质量代码改善程序的157个建议:使用Dynamic来简化反射的实现

    最近有时间看点书了,把157个建议在重新看一遍,代码都调试一遍.当我看到第15个建议的时候有些出入,就记录下来,欢迎大家来探讨. 第十五条建议是,使用dynamic简化反射的使用,没有说明具体的条件. ...

  3. 使用dynamic来简化反射实现,调用指定方法或构造函数

    dynamic是Framework4.0的新特性,dynamic的出现让C#具有了弱语言类型的特性,编译器在编译的时候,不再对类型进行检查,不会报错,但是运行时如果执行的是不存在的属性或者方法,运行程 ...

  4. 编写高质量代码改善C#程序的157个建议——建议15: 使用dynamic来简化反射实现

    建议15: 使用dynamic来简化反射实现 dynamic是Framework 4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译器默认dy ...

  5. 简单尝试Spring Cloud Gateway

    简单尝试Spring Cloud Gateway 简介 Spring Cloud Gateway是一个API网关,它是用于代替Zuul而出现的.Spring Cloud Gateway构建于Sprin ...

  6. C# 反射简单介绍

    原文:https://blog.csdn.net/wu1020300665/article/details/82958455 1.什么是反射 反射是.NET中的重要机制,通过反射,可以在运行时获得程序 ...

  7. Java反射+简单工厂模式总结

    除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...

  8. Java反射简单使用--第一次细致阅读底层代码

    1:所写的东西都经过验证,保证正确,环境jdk8,eclipse2:在例子中,尽量以生产环境中实际代码为例,那种固定值什么的没什么意义 问题: 1:想获取调用方法所需要的参数 2:参数是以json形式 ...

  9. python+selenium 简单尝试

    前言 selenium是一种自动化测试工具,简单来说浏览器会根据写好的测试脚本自动做一些操作. 关于自动化测试,一开始接触的是splinter,但是安装的时候发现它是基于selenium的,于是打算直 ...

随机推荐

  1. SpiderMonkey-让你的C++程序支持JavaScript脚本

    译序 有些网友对为什么D2JSP能执行JavaScript脚本程序感到奇怪,因此我翻译了这篇文章,原文在这里.这篇教程手把手教你怎样利用SpiderMonkey创建一个能执行JavaScript脚本的 ...

  2. 信号之system函数

    在http://www.cnblogs.com/nufangrensheng/p/3512291.html中已经有了一个system函数的实现,但是该版本并不执行任何信号处理.POSIX.1要求sys ...

  3. java_Cookies_1_商品浏览历史记录servlet1

    public class CookiesServlet1 extends HttpServlet { public void doGet(HttpServletRequest request, Htt ...

  4. 对JavaScript对象数组按指定属性和排序方向进行排序

    引子 在以数据为中心的信息系统中,以表格形式展示数据是在常见不过的方式了.对数据进行排序是必不可少的功能.排序可以分为按单个字段排序和按多个字段不同排序方向排序.单字段排序局限性较大,不能满足用户对数 ...

  5. js 添加enter事件

    $(function () { document.onkeydown = function (e) { var ev = document.all ? window.event : e; ) { if ...

  6. [转]使用Oracle SQL Developer连接数据库并创建用户

    本文转自:http://blog.csdn.net/xw13106209/article/details/6594738 1.使用sys账户创建数据库连接 安装Oracle 11g会自带一个叫做SQL ...

  7. 理解JavaScript原型式继承

    0.基础 javascript没有类的概念, javascript不需要实例化某个具体类的实例.javascript对象本身可以用来创建对象, 而对象可以继承自其他对象, 这个概念称为原型式继承 每个 ...

  8. html同一个页面多个倒计时

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  9. ACM——搜索(一)

    南邮OJ——1108 搜索(一) 时间限制(普通/Java):3500MS/10500MS          运行内存限制:65536KByte总提交:1023            测试通过:367 ...

  10. MFC程序实现窗口分割,视图快捷插入控件和插入列表

    将视图中插入列表: 1.创建一个MFC应用程序,在MFC Wizard中,生成的类选项,如图 2.选择CListView作为基类 3.在CXXView.cpp(XX为你的程序名)重写虚函数OnInit ...