最近在自己瞎整设计自己的数据访问层(纯属深入了解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. javascript中false值及其常见比较运算

    1. ture或者false的值 if判断中会被隐式转换成false的boolean类型的值有 false, 0, undefined , null , '', NaN(not a number) 除 ...

  2. 常用Linux运维命令

    1.查看TCP连接状态 netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn netstat -n | awk '/^tcp/ {++S[$NF]} ...

  3. Android NDK STL

    相信Android开发者都喜欢用C++编写一些高效的应用,有关Android NDK的C++开发相关知识总结如下:       从Android NDK r5开始支持了STL Port,在这个版本开始 ...

  4. 如何让PHP支持Redis

    原理:php默认扩展库不含有redis扩展:要支持redis扩展,需要有redis.so这个扩展文件 所以我们的目标就是生成redis.so扩展文件,并修改php.ini 让其支持redis扩展. 准 ...

  5. JavaScript总结3—对象

    对象是JavaScript的基本类型,他可以从一个称为原型的对象继承属性,这种原型式继承是JavaScript的核心特征.对对象比较常见的操作有:创建,设置,查找,删除,检测和枚举他的属性.每个对象都 ...

  6. FullPage.js全屏滚动插件的配置项、方法和回调函数

    fullPage.js 是一个基于 jQuery 的插件,它能够很方便.很轻松的制作出全屏网站,主要功能有: 支持鼠标滚动 支持前进后退和键盘控制 多个回调函数 支持手机.平板触摸事件 支持 CSS3 ...

  7. 寻找对象在父元素下的index

    方法一. window.onload=function(){    //寻找对象在父元素下的index    function getIndexParent(element){         var ...

  8. C#下解决DrawImage画出来的Image变大了的问题

    如: private Image image= Resources.image1;//假设image1这张资源图是360×600这么大 private Graphics graphics; graph ...

  9. .net MVC中JsonResult 返回类

    /// <summary> /// 返回消息类 /// </summary> public class ReturnMessage { private IDictionary& ...

  10. LeetCode初体验—twoSum

    今天注册了大名鼎鼎的LeetCode,做了一道最简单的算法题目: Given an array of integers, return indices of the two numbers such ...