【.NET深呼吸】动态类型(扩充篇)
前面两文中,老周已向大家介绍了关于动态类型对象的两种级别的使用方案,本篇呢,老周再讲一个自定义动态类型的例子。
前面给大家演示的例子中,动态类型中包装的是字典类型来存储数据的,这一次咱们换一种风味,老吃酸的不好,这回就吃点辣的吧,火锅就不吃了,据说火锅的汤底里面有罂粟果的皮,吸食微型鸦片不好。
本例在自定义的动态类型中包装一个XML文档,就用XML来存数据吧。
还是老方法,从DynamicObject类派生出来。
这里我主要实现以下几个功能:
1、可以设置属性,这个是肯定要的,不然怎么赋值数据呢。
public override bool TrySetMember(SetMemberBinder binder, object value)
{
// 查找相应的元素
var q = from x in xdoc.Root.Elements("item")
where ((string)x.Attribute("key")) == binder.Name
select x;
if (q.Count() > )
{
// 如果元素存在,就修改
XElement ele = q.First();
ele.SetAttributeValue("key", value);
}
else
{
// 如果元素不存在,就添加
XElement ele = new XElement("item");
ele.SetAttributeValue("key", binder.Name);
ele.SetAttributeValue("value", value.ToString());
xdoc.Root.Add(ele);
}
return true;
}
相信大家还记得,实现不同功能,就是重写不同的虚方法。如果操作成功,就返回true,如果不成功就返回false。在实现中,首先用LINQ筛选XML根下面的item元素,每个item元素存一条数据,元素中key特性表示动态设置的属性名,value表示属性值。也就是说,每个属性的存储结构是这样的:
<item key = "Age" value = "105" />
2、实现属性的get功能,有了赋值,当然也要允许取值,不然会阴阳失调的。
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = string.Empty;
// 筛选
var q = from x in xdoc.Root.Elements("item")
where ((string)x.Attribute("key")) == binder.Name
select x.Attribute("value").Value;
if (q.Count() > )
{
// 取值
result = q.First();
return true;
}
return false;
}
原理和上面差不多,用LINQ查出包含指定成员的名字,binder的Name属性就是被调用的动态成员的名字。查询到对应的项后,把值返回。
3、实现转换功能,想让动态类型支持类型转换,可以重写TryConvert方法。
public override bool TryConvert(ConvertBinder binder, out object result)
{
result = null;
// 如果是隐式转换,只支持转换为字符串类型
if (binder.Explicit == false)
{
if (binder.Type != typeof(string))
{
return false;
}
result = xdoc.Root.ToString();
return true;
}
// 如果是显式转换,只支持转换为XElement类型
else
{
if (binder.Type != typeof(XElement))
{
return false;
}
result = xdoc.Root;
return true;
} return false;
}
注意这个binder,它有一个属性叫Explicit,大家还记得老周前不久写过有关自定义转换的烂文,转换有隐式和显示,这个属性如果为true,表明这个动态对象正在被显式转换为其他类型,像这样:
oo = (string)dynamicObj;
如果属性为false,就表明正在进行隐式转换,像:
oo = dynamicObj;
binder的Type属性表示要转换的目标类型的type,如果要转换为int,那就是typeof(int)。转换后的值赋值给result参数。
我这里实现的功能是:隐式的话,转换为string;显式的话,转为XElement对象。
最后,在类中初始化一下包装的XML文档。
private XDocument xdoc = null; public MyXmlDynamic()
{
// 初始化文档
xdoc = new XDocument(new XElement("root"));
}
好了,这个自定义的动态类型完成了,当然了,接下来就是测试。
dynamic d = new MyXmlDynamic();
d.Name = "王老三";
d.Desc = "大坏蛋";
d.Age = ; Console.WriteLine("Name = {0}, Desc = {1}, Age = {2}", d.Name, d.Desc, d.Age); // 测试隐转
string xml = d;
Console.WriteLine("\n隐式转换为XML字符串:\n" + xml); // 测试显转
XElement x = (XElement)d;
Console.WriteLine("\n\n显式转换为XML元素:\n" + x);
于是,得到如下结果:
至此,有关动态类型的话题,老周就讲完了,不知道这位网友看懂否?看不懂也没关系,可以慢慢去研究,多动手干活,就会明白了。编程这玩意儿,很多时候就是依靠动手去试出来的,光读理论没多大用处,更何况,编程是技术性的东西,写再多的理论也没什么用,老周十几年来,一如既往地对编程理论不感兴趣。
所以,有人就跟老周说,老周,你写的东西太不深入了;老周,你的书太没有深度了。
反正我不懂什么叫深度,什么叫深入,老周只想着写出来,人人都能看懂。写那么生僻难懂做什么,不就是敲键盘、写代码吗,是吧,搞那么复杂干吗。
你要是希望老周写点玄学、道学、佛学、儒学、美学、书学相关的文章,那就不同了,那样老周也可以写得很抽象,为啥,因为美学、玄学本来就是抽象。人家庄爷爷说了,不抽象的美都是俗气,抽象的美才是天地大美。
所以说嘛,写什么样的内容就用什么样的方法,写编程的东西,老周是拒绝抽象的。
【.NET深呼吸】动态类型(扩充篇)的更多相关文章
- 【.net深呼吸】动态类型(高级篇)
前面老周给大家介绍了动态类型使用的娱乐级别用法,其实,在很多情景下,娱乐级别的用法已经满足需求了. 如果,你想自己来控制动态类型的行为和数据的存取,那么,就可以考虑用今天所说的高大上技术了.比如,你希 ...
- 【.net深呼吸】动态类型(娱乐篇)
有朋友跟老周说,动态类型是干吗的,他不太熟悉,希望老周可以讲一讲.没事,这事情老周也比较TMD乐意做的,因为老周写的这些烂文本来就是为了普及基础知识的,坚定不移地为社会基础教育而服务. 首先,咱们要知 ...
- Python 学习 第四篇:动态类型模型
Python的变量不用声明,赋值之后就可以直接使用,类型是在运行过程中自动确定的,这就是动态类型模型.该模型把变量和对象设计成两个不同的实体,对象是存储数据的地方,对象的类型是由初始值自动决定的,而变 ...
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...
- 【转】解析JDK 7的动态类型语言支持
http://www.infoq.com/cn/articles/jdk-dynamically-typed-language Java虚拟机的字节码指令集的数量自从Sun公司的第一款Java虚拟机问 ...
- Net 4.0 之 Dynamic 动态类型
Net 4.0 之 Dynamic 动态类型 本文主要旨在与网友分享.Net4.0的Dynamic 对Duck Type 的支持. 一..net4.0主要新特性 .Net4.0在.Net3.5 ...
- 享受Python和PHP动态类型检查语言的快感
前言 写这文章的时候特地查了资料,以确保我没有说错关于Python和PHP的类型机制. 所以这里放一张图,关于强弱类型与动态/静态类型检查的区分 从分类上看,PHP属于弱类型语言,而Python属于强 ...
- C#基本语法 - .Net 4.0 之 Dynamic 动态类型
一..net4.0主要新特性 .Net4.0在.Net3.5基础上新增的主要特性有:可选参数.命名参数和Dynamic.具体请阅生鱼片的这篇博文.这里我们着重讲解C#4.0的Dynamic特性,对 ...
- C#如何根据DataTable生成泛型List或者动态类型list
背景:在项目中,sql语句检索返回DataTable,然后根据检索结果做进一步的操作,本篇文章即是介绍如何将DataTable快速生成泛型List返回. 假设存在如下学生类: public class ...
随机推荐
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- 在线浏览PDF之PDF.JS (附demo)
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#skill 下载地址:http://mozilla.gith ...
- SQLServer地址搜索性能优化例子
这是一个很久以前的例子,现在在整理资料时无意发现,就拿出来再改写分享. 1.需求 1.1 基本需求: 根据输入的地址关键字,搜索出完整的地址路径,耗时要控制在几十毫秒内. 1.2 数据库地址表结构和数 ...
- C#多线程之线程同步篇1
在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...
- vue.js学习笔记
有了孩子之后,元旦就哪也去不了了(孩子太小),刚好利用一些时间,来公司充充电补补课,学习学习新技术,在这里做一个整理和总结.(选择的东西,既然热爱就把他做好吧!). 下来进入咱们的学习环节: 一.从H ...
- SSH免手动输入密码和设置代理
通过使用sshpass将密码写入命令里,直接执行,免去手动密码输入的步骤命令如下: sshpass -p password_abc ssh user_abc@ssh_host -p ssh_port ...
- ubuntu系统(华硕笔记本)屏幕亮度用Fn控制的调节设置
亲测配置: 系统:Linux lite 3.2 x86_64(Ubuntu其他版本可参考修改) 笔记本:华硕(asus)1201N 达到的效果: 可以正常使用Fn+F5调暗,Fn+F6调亮. 设置步骤 ...
- 学习笔记 :DrawText
最近在做一个TStringGrid的自绘处理,在画文字处理上遇到了高度的计算问题.后来经过一段时间还是找到了一些方法: 1.使用TLabel 这个方法是有点绕路的,方法倒是简单,就是使用AutoSiz ...
- Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器
最近在业余时间玩玩树莓派,刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚,从而控制LED发光二极管的闪烁,后来觉得,是不是可以使用HTML5+jQuery等流 ...
- MyBatis2:config.xml文件
前言 前一篇文章,讲了MyBatis入门,讲到了MyBatis有两个基本的配置文件,一个用来配置环境信息,一个用来写SQL语句.前者我把它命名为config.xml,config.xml的内容是: & ...