利用 C# dynamic 减少创建模型类
C# 的 dynamic 关键字可以是C#可以像 javascript 这种弱类型语言一样具有随时可以添加属性的能力。C# 是一种强类型语言,dynamic 要摆脱类型的限制,自然是有代价的。这里不讨论CPU做了多少额外的工作使得 C# 具有了超脱其天性的能力。然而这种能力会简化我们的编程。在项目开发中给我带来的实实在在的好处就是减少创建模型类。
分享一下 dynamic 应用
在做 web 项目时,有时候页面上的某个角落要显示一些简单的信息,或者一些下拉框里的信息等等。这些信息的信息量小,用的地方少。为了获取这些信息专门定义一个 Class 有点不值得,而且增加了我们模型类的数量,看着那么多模型类就烦。 dynamic 关键词可以很好的解决这个问题。
代码如下:
/// <summary>
/// 返回动态类型的数据。
/// </summary>
/// <returns></returns>
private dynamic DynamicInfo()
{
dynamic item = null;
List<ExpandoObject> li = new List<ExpandoObject>();
for (var i = ; i < ; i++)
{
item = new ExpandoObject();
item.数字 = i;//为动态类型添加信息
item.字母 = string.Format("{0}", (Char)i);//为动态类型添加信息
li.Add(item);
}
return li;
}
怎么把这些动态信息返回到客户端呢?当然是序列化成json格式,通过 jQuery 的 ajax 功能很容易获取到。下面是mvc4里的实现:
public JsonResult GetDynamicInfo()
{
return Json(DynamicInfo(), JsonRequestBehavior.AllowGet);
}
客户端获取服务器端数据,并将数据以表格的形式显示的在客户端:
$.getJSON("/Home/GetDynamicInfo", function (data) {
if (data && data.length > 0) {
var table = document.createElement("table"), tr, td, text;
tr = document.createElement("tr");
table.appendChild(tr);
for (var b = 0; b < data[0].length; b++) {
td = document.createElement("td");
text = document.createTextNode(data[0][b].Key);
td.appendChild(text);
tr.appendChild(td);
}
for (var a = 0; a < data.length; a++) {
tr = document.createElement("tr");
table.appendChild(tr);
for (var b = 0; b < data[a].length; b++) {
td = document.createElement("td");
text = document.createTextNode(data[a][b].Value);
td.appendChild(text);
tr.appendChild(td);
}
}
document.body.appendChild(table);
}
});
显示效果如下,当然有点简陋:

上面分享了从服务器端到客户端的整个过程,可以看到利用动态类型,我们并没有建立一个具有数字,字母两个字段的模型类。
关于 dynamic
dynamic 类型定义的代码,在编译期间不会进行类型检查,编译器假定给 dynamic 类型定义的对象的任何操作都是正确的。 dynamic 与 var 这两个关键词是不一样的。var 关键词定义的对象只是延迟确定其类型,类型一旦确定,就不能再改变了。而 dynamic 定义的类型在运行期间可以多次被改变。为什么呢,很简单,因为 dynamic 类型的对象是在运行期间根据程序的静态代码信息确定的,也就是在编写代码时定义了多少种类型,那么运行期间就可以确定出对应的类型。例如:
dynamic d = 0;
d = "change to a string.";
d = 'a';
运行期间,就可以计算出对象 d 依次是 int, string, char.
dynamic 为我们的编程带来方便的同时,也是以牺牲了一部分性能为代价的。查看 dynamic 类型的代码生成的 IL,会发现编译器做了很多的工作。
查看第一部分分享应用的代码,会发现用了一个 ExpandoObject 类。这个类微软定义的应用动态类型的辅助类,是一个密封类,继承自 DynamicObject。 当然在使用动态类型时,也可以直接使用 DynamicObject,但是要做很多的工作去实现类似 ExpandoObject 实现的工作。既然微软已经有现成的,那么就用现成的吧。
利用 C# dynamic 减少创建模型类的更多相关文章
- day94:flask:Jinjia2模板引擎&flask中的CSRF攻击&Flask-SQLAlchemy的创建模型类和基本的增删改查
目录 1.Jinjia2模板引擎 1.Jinjia2加载模板并传递数据到模板中 2.Jinjia2的模板语句 3.模板中特有的变量和函数 4.模板中内置的过滤器 5.自定义过滤器 6.模板继承 2.在 ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类) - Part.1
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类)
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- Asp.Net MVC 使用Entity Framework创建模型类
先来说说LINQ to SQL和Entity Framework的区别: LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术.他们之间的本质区别在于EF ...
- 05-06 Flutter JSON和序列化反序列化、创建模型类转换Json数据、轮播图数据渲染:Flutter创建商品数据模型 、请求Api接口渲染热门商品 推荐商品
Config.dart class Config{ static String domain='http://jd.itying.com/'; } FocusModel.dart class Focu ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 利用MyEclipse自动创建PO类、hbm文件(映射文件)、DAO
原文地址:http://blog.csdn.net/fangzhibin4712/article/details/7179414 前提条件:表sjzdfl 表sjzdxx (使用数据库MySQL) ...
- django的模型类管理器-----------数据库操作的封装
模型实例方法 str():在将对象转换成字符串时会被调用. save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句. delete():将模型对象从数据表中删除 ...
- django定义模型类-14
目录 1. 定义 字段类型 约束类型 django的模型类定义在应用下的 models.py 文件中. 模型类继承自 django.db.models 包下的 Model 类. 新创建应用 book ...
随机推荐
- HashMap、ConcurrentHashMap以及HashTable(面试向)
---->HashMap 在java1.7中,hashmap的数据结构是基于数组+链表的结构,即我们比较熟悉的Entry数组,其包含的(key-value)键值对的形式.在多线程环境下,Hash ...
- Python re模块 subprocess模块
re模块 内部实现不是Python 而是调用了c的库 re是什么 正则 表达 式子 就是一些带有特殊含义的符号或者符号的组合作用: 对字符串进行过滤 在一对字符串中找到所关心的内容 你就需要告诉计算机 ...
- Error opening session. Cause: java.lang.NullPointerExcept.
在学mybatis时遇到这个问题,后面发现时打错了一个字母,发现后分享出来,如果发现这个错误也能够更好的排除错误. 如图可以发现我不小心把default打成了defaule所以出现了这个错误,也找了好 ...
- JavaScript之作用域和闭包
一.作用域 作用域共有两种主要的工作模型:第一种是最为普遍的,被大多数编程语言所采用的词法作用域,另外一种叫作动态作用域: JavaScript所采用的作用域模式是词法作用域. 1.词法作用域 词法作 ...
- Python之“Hello World”
Python之“Hello World” 了解Python: 编译型和解释型 编译:把明文代码执行前,先转换成二进制,在执行.这个过程叫编译 解释器:将明文代码转成二进制的 Linux中,gcc编译, ...
- 集训第六周 数学概念与方法 计数 排列 L题
Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样. 话 ...
- Spring 事物注解属性
@Transactional属性 . propagation 事物的传播属性 . isolation 事物的隔离属性 . readonly 设置只读属性 . timeout 设置超时属性 . roll ...
- 一个ajax实例
一个ajax实例 html <!DOCTYPE html> <html lang="zh-cn"> <head> <meta ch ...
- Java基础学习总结(89)——为什么单元测试应该我们开发人员来写
软件测试是为了保证项目质量,单元测试可以快速执行测试回归测试,做好单元测试可以大大提升测试效率,项目开发真正达到敏捷效果. 单元测试做什么? 1. 核心类方法 2. 异常处理 3. 边界值测试 4. ...
- SPOJ 3261 (树套树傻逼题)
As another one of their crazy antics, the N (1 ≤ N ≤ 100,000) cows want Farmer John to race against ...