最近在自己瞎整设计自己的数据访问层(纯属深入了解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. 金蝶KIS 13.0专业版破解方法破解安装流程 金蝶KIS 13.0专业版安装流程

    金蝶KIS 13.0安装 1.先安装操作系统Windows server 2008 R2. 2.再安装SQL2008 R2. 3.再安装金蝶KIS 13.0专业版. 在安装时记住须要将系列号设置成为1 ...

  2. 火车票硬座座位位置分布图、火车座位分布图 andydao

    夏天要是坐火车硬座在火车上过夜的话,最好带一个小外套,以防睡觉着凉.

  3. C#_IComparer实例 - 实现ID或者yearOfscv排序

    调用LIST的Sort的时候会调用IComparer的默认实现,quicksort会调用每个元素的CompareTo的IComparable实现 using System; using System. ...

  4. IIS 之 查看并发连接数

    如果要查看IIS连接数,最简单方便的方法是通过“网站统计”来查看,“网站统计”的当前在线人数可以认为是当前IIS连接数.然而,“网站统计”的当前在线人数统计时间较长,一般为10分钟或15分钟,再加上统 ...

  5. A+B Problem III

    描述 求A+B是否与C相等. 输入 T组测试数据. 每组数据中有三个实数A,B,C(-10000.0<=A,B<=10000.0,-20000.0<=C<=20000.0) 数 ...

  6. jsp 用application对象制作留言板

    <%@ page contentType="text/html; charset=gb2312"%> <html> <body> <for ...

  7. mysql数据库常用语句2

    关于mysql常用语句的整理,上一篇涉及到ddl.dml以及一些简单的查询语句. 1:mysql分页查询 select * from table_name limit 5,10;   从下标为5元素查 ...

  8. Mac下Sublime Text Vim模式 方向键无法长按

    在Mac终端输入(不是sublime text里的console),分别对应ST2.ST3: defaults ApplePressAndHoldEnabled -bool false default ...

  9. gcc的基础知识

    GCC(GNU Compiler Collection,GNU编译器集合)是一套由GNU工程开发的支持多种编程语言的编译器. 基本用法 在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件 ...

  10. JVM优化

    1.堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64 ...