利用 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 ...
随机推荐
- mysql cluster配置
依赖包要求:cmake gcc gcc-c++ ncurses Perl ncurses-devel 在7.3以及更高的版本中, WITH_NDB_JAVA是默认 ...
- UVa 1600 Patrol Robot(BFS)
题意: 给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= ...
- noip模拟赛 道路分组
分析:因为每一组编号都是连续的嘛,所以能分成一组的尽量分,每次加边后dfs判断一下1和n是否连通.有向图的判连通没有什么很快的方法,特别注意,并查集是错的!这个算法可以得到60分. 事实上每一次都不需 ...
- 洛谷P1186 玛丽卡
题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城 ...
- Codeforces 631B Print Check【模拟】
题意: 按顺序给定列和行进行涂色,输出最终得到的方格颜色分布. 分析: 记录下涂的次序,如果某个元素的横和列都被涂过,那么就选择次序最大的颜色. 代码: #include<iostream> ...
- zoj2479 Cover the Rectangular Ground
肯定是dfs搜一下的,但是呢存在一个很大的剪枝,也就是面积必定要是相等的,那么如何去操作呢,可以想到的是二进制枚举选取的方法,然后把方法中选取的矩形面积求和并判断一下即可,然后dfs搜索,要注意的是, ...
- Ice Cave-CodeForces(广搜)
链接:http://codeforces.com/problemset/problem/540/C You play a computer game. Your character stands on ...
- 选择器(E:hover/E:active/E:focus的使用)
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...
- 【.Net 学习系列】-- Windows服务定时运行,判断当前时间是否在配置时间段内
/// <summary> /// 判断程序是否在设置运行时间内 /// </summary> /// <param name="startTime" ...
- session问题总既然(深入理解)&Token问题理解&sso单点登陆理解实现
一.Session使http协议成为有状态协议(浏览器cookie本地这个session,服务器端也有这个session) 1.ajax前端登陆无法保存session,造成无法维持登陆状态(http本 ...