C#高级编程9-第12章 动态语言扩展
C#高级编程9-第12章 动态语言扩展
dynamic t = new ExpandoObject();
t.Abc = "abc";
t.Value = ;
Console.WriteLine(t.Abc);
t.Abc = "";
Console.WriteLine(t.Abc);
dynamic动态类型的值是可读可写的,它是编译型语言,而Javascript是解释性语言.因此JavaScript定义后可以引用它。而dynamic定义后,无法引用它,无法获知它的类型是什么.只有编译运行时才能获得它的类型.
因此当我们无法获知它的类型时就会出现未知的异常,比如说类型转换异常、序列化异常、对象或属性不存在等等。因此对于使用dynamic时常常需要处理系统异常。 对于dynamic动态类型,它仅仅是一种类型,对于var类型它可以是一种序列化的字符串.
dynamic t = new ExpandoObject();
t.Abc = "abc";
t.Value = ;
Console.WriteLine(t.Abc);
t.Abc = "";
Console.WriteLine(t.Abc); Console.WriteLine(t.ToString()); var t2 = new { Abc = "abc", Value = };
Console.WriteLine(t2.ToString());

对于var而言它可以声明后立即使用它,但是它的优点是如果var声明的成员它是只读的。但是声明成员值是可以修改的.

var t2 = new { Abc = "abc", Value = new { Item= new Person() } };
对于dynamic 而言,它声明后也可以立即使用它,它的成员可读可写,但是它是没有类型的需要编码者判断其来源和属性。
DynamicObejct 是所有动态类的基类,可以从其继承以实现自己的动态对象。ExpandoObject 是一个sealed 类,已经封装好了所有方法。
static void Main(string[] args)
{
dynamic dynamicObject = new MyDynamicObject();
dynamicObject.FirstName = "Alan";
dynamicObject.LastName = "Yang";
dynamicObject.Age = ;
Action<dynamic> show = (item) => Console.WriteLine("My name is " + item.FirstName + " " + item.LastName
+ ". I'm " + item.Age + " years old.");
dynamicObject.Show = show;
dynamicObject.Show(dynamicObject);
Console.Read();
}
public class MyDynamicObject : DynamicObject
{
Dictionary<string, object> _dynamicData = new Dictionary<string, object>();
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
bool success = false;
result = null;
if (_dynamicData.ContainsKey(binder.Name))
{
result = _dynamicData[binder.Name];
success = true;
}
else
{
result = "Property Not Found!";
success = false;
}
return success;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_dynamicData[binder.Name] = value;
return true;
}
public override bool TryInvokeMember(InvokeMemberBinder binder,
object[] args,
out object result)
{
result = true;
dynamic method = _dynamicData[binder.Name];
method(args[]);
return true;
}
}
ExpandoObject
static void Main(string[] args)
{
dynamic dynamicObject = new ExpandoObject();
dynamicObject.FirstName = "Alan";
dynamicObject.LastName = "Yang";
dynamicObject.Age = ;
Action<dynamic> show = (item) => Console.WriteLine("My name is " + item.FirstName + " " + item.LastName
+ ". I'm " + item.Age + " years old.");
dynamicObject.Show = show;
dynamicObject.Show(dynamicObject);
Console.Read();
}
ViewBag
public dynamic ViewBag
{
get
{
if (_dynamicViewData == null)
{
_dynamicViewData = new DynamicViewDataDictionary(() => ViewData);
}
return _dynamicViewData;
}
}
DynamicViewDataDictionary 类的定义为:
using System.Collections.Generic;
using System.Diagnostics;
using System.Dynamic;
namespace System.Web.Mvc
{
internal sealed class DynamicViewDataDictionary : DynamicObject
{
private readonly Func<ViewDataDictionary> _viewDataThunk;
public DynamicViewDataDictionary(Func<ViewDataDictionary> viewDataThunk)
{
_viewDataThunk = viewDataThunk;
}
private ViewDataDictionary ViewData
{
get
{
ViewDataDictionary viewData = _viewDataThunk();
Debug.Assert(viewData != null);
return viewData;
}
}
// Implementing this function improves the debugging experience as it provides the debugger with the list of all
// the properties currently defined on the object
public override IEnumerable<string> GetDynamicMemberNames()
{
return ViewData.Keys;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = ViewData[binder.Name];
// since ViewDataDictionary always returns a result even if the key does not exist, always return true
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
ViewData[binder.Name] = value;
// you can always set a key in the dictionary so return true
return true;
}
}
}
C#高级编程9-第12章 动态语言扩展的更多相关文章
- 【读书笔记】C#高级编程 第十二章 动态语言扩展
(一)DLR C#4的动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务. (二)dynamic类型 dynamic类型允许 ...
- python高级编程(第12章:优化学习)1
# -*- coding: utf-8 -*-# python:2.x__author__ = 'Administrator'#由于5,6,7,8,9,10,11主要是在包,测试之类的学习所以这边就不 ...
- python高级编程(第12章:优化学习)3
#微观剖析 ''' 当找到速度很慢函数时,有时还需要做到测试某个部分函数剖析工作,这需要通过手动对一部分代码速度测试完成 ''' """ import tempfile, ...
- python高级编程(第12章:优化学习)2
#优化策略 #3个原则 """ 1a:寻找其他原因:确定第三方服务器或资源不是问题所在 2a:度量硬件:确定资源足够用 3a:编写速度测试:创建带有速度要求的场景 &qu ...
- 读《C#高级编程》第1章问题
读<C#高级编程>第1章 .Net机构体系笔记 网红的话:爸爸说我将来会是一个牛逼的程序员,因为我有一个梦,虽然脑壳笨但是做事情很能坚持. 本章主要是了解.Net的结构,都是一些概念,并没 ...
- C#高级编程9 第17章 使用VS2013-C#特性
C#高级编程9 第17章 使用VS2013 编辑定位到 如果默认勾选了这项,请去掉勾选,因为勾选之后解决方案的目录会根据当前文件选中. 可以设置项目并行生成数 版本控制软件设置 所有文本编辑器行号显示 ...
- C#高级编程9 第18章 部署
C#高级编程9 第18章 部署 使用 XCopy 进行部署 本主题演示如何通过将应用程序文件从一台计算机复制到另一台计算机来部署应用程序. 1.将项目中生成的程序集复制到目标计算机,生成的程序集位于项 ...
- C#高级编程9 第16章 错误和异常
C#高级编程9 第16章 错误和异常 了解这章可以学会如何处理系统异常以及错误信息. System.Exception类是.NET运行库抛出的异常,可以继承它定义自己的异常类. try块代码包含的代码 ...
- Azure Table storage 之改进DynamicTableEntity类为其添加动态语言扩展
在之前的一篇文章中提到,storage类库中包含一个可以用来动态获取Azure table storage 表结构的类-DynamicTableEntity. 我们可以通过这个类,我们无需为每一个表提 ...
随机推荐
- Json对象和字符串互相转换 数据拼接 JSON使用方式
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 一.JSON字符串转换为JSON对象: eval() 和 JSON.parse eg- json字符串: ...
- 一个shell的面试题
5.写一个脚本,实现判断192.168.1.024网络里,当前在线的D有哪些,能ping通则认为在线,在线输出"TP地址UP",不在线输出TP地址DOWN",无其他输出. ...
- ubuntu系统初始化网络及mysql配置
安装系统时需要安装open-ssh服务软件,否则无法远程连接 1.修改root密码 # sudo passwd 输入密码即可 切换到root用户,需要输入刚才的root密码 # su - 2.配置网络 ...
- dell R720服务器设置开机启动顺序
开机按F2进入系统启动设置,也可以按F11进入快速启动配置
- MySQL中adddate学习
-- 修改时间:ADDDATE(date,INTERVAL expr unit) -- 含义:date时间,expr 表达式值,unit表达式对应的时间单位 -- unit : SECOND,MINU ...
- python 全栈开发,Day2(in,while else,格式化输出,逻辑运算符,int与bool转换,编码)
一.in的使用 in 操作符用于判断关键字是否存在于变量中 a = '男孩wusir' print('男孩' in a) 执行输出: True in是整体匹配,不会拆分匹配. a = '男孩wusir ...
- [转] 基于NodeJS的前后端分离的思考与实践(五)多终端适配
前言 近年来各站点基于 Web 的多终端适配进行得如火如荼,行业间也发展出依赖各种技术的解决方案.有如基于浏览器原生 CSS3 Media Query 的响应式设计.基于云端智能重排的「云适配」方案等 ...
- 【Java】 剑指offer(54) 二叉搜索树的第k个结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一棵二叉搜索树,请找出其中的第k小的结点. 思路 设置全局变量 ...
- 013 JstlView
一:InternalResourceViewResolver 1.InternalResourceViewResolver JSP是常见的视图技术,可以使用InternalResourceViewRe ...
- 004 Spark中的local模式的配置以及测试
一:介绍 1.Spark的模式 Local:本地运行模式,主要用于开发.测试 Standalone:使用Spark自带的资源管理框架运行Spark程序,30%左右 Yarn: 将spark应用程序运行 ...