动态类(Dynamic)应用
动态类(Dynamic)应用
背景: 在Coding中有时候会遇到一些需要解析的数据,可是数据的字段数量和名称未统一,我们没法定义实体类来对应。那么我们就会想到通过C#的dynamic动态类来实现,如果大家注意的话一些ORM框架里面貌似都有用到dynamic来实现一部分功能。
一.Dynamic的基本应用
1.1 通过.PropertyName来添加属性,和JavaScript的对象差不多.不过对于我们所要解析的数据,我们事先也许根本不知道属性名称,所以用这种方法意义不大.
dynamic myObj = new ExpandoObject();
myObj.Name = "Frank";
Console.WriteLine(myObj.Name);
二.Dynamic自定义属性名称.
2.1: 继承DynamicObject,里面提供了各种方法,重写后可以实现属性的添加.

public sealed class MyExtendsObject : DynamicObject
{
private readonly Dictionary<string, object> _properties; public MyExtendsObject(Dictionary<string, object> properties)
{
_properties = properties;
} public override IEnumerable<string> GetDynamicMemberNames()
{
return _properties.Keys;
} public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (_properties.ContainsKey(binder.Name))
{
result = _properties[binder.Name];
return true;
}
else
{
result = null;
return false;
}
} public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (_properties.ContainsKey(binder.Name))
{
_properties[binder.Name] = value;
return true;
}
else
{
return false;
}
}
}

2.2 通过字典来添加属性和赋值

public static void Main(string[] args)
{
dynamic myObj = new ExpandoObject();
Dictionary<string, object> dic = new Dictionary<string, object>()
{
{"Name","Frank"},
{"Age",23}
}; myObj = new MyExtendsObject(dic);
Console.WriteLine(myObj.Age); //23
}

三.Dynamic解析XML.
3.1 定义xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<Person>
<Name>Frank</Name>
<Age>23</Age>
<Address>TianFu SoftWarePark</Address>
</Person>
3.2 继承DynamicObject

public sealed class MyExtensXMLObj : DynamicObject
{
private readonly XElement node; public MyExtensXMLObj(XElement node)
{
this.node = node;
} public override bool TrySetMember(SetMemberBinder binder, object value)
{
var elements = node.Elements().ToList();
var currentElement = elements.FirstOrDefault(x => x.Name == binder.Name);
if (currentElement != null)
{
currentElement.Value = value as string;
return true;
}
else
{
return false;
}
} public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var elements = node.Elements().ToList();
var currentElement = elements.FirstOrDefault(x => x.Name == binder.Name);
if (currentElement != null)
{
result = currentElement.Value;
return true;
}
else
{
result = null;
return false;
}
}
}

3.3 结果输出:
public static void Main(string[] args)
{
XElement root = XElement.Load(@"Test.xml");
dynamic personList = new MyExtensXMLObj(root);
Console.WriteLine(personList.Name); // Frank
}
四. 继承规则.
1. 子类里面包含一个私有变量,用于存储数据. 这暂且叫做Data;
2.TryGetMember(GetMemberBinder binder, out object result) 方法实现对数据的获取. binder.Name就是需要获取的属性的名称,result 是获取的属性值. 通过binder.Name在Data中获取到对应的属性值,传出到外面.(注意到了吧result是out参数)
3.TrySetMember(SetMemberBinder binder, object value) 对存在的属性进行赋值. 上面的Set方法中,我都判断了binder.Name在data里面是否存在。如果不存在就无法赋值。返回false,如果外面对不存在的属性复制那么将会报错.
动态类(Dynamic)应用的更多相关文章
- C#笔记---动态类(Dynamic)应用
背景: 在Coding中有时候会遇到一些需要解析的数据,可是数据的字段数量和名称未统一,我们没法定义实体类来对应.那么我们就会想到通过C#的dynamic动态类来实现,如果大家注意的话一些ORM框架里 ...
- 使用动态类型dynamic让你的省了很多临时类
客户端与服务端的数据交互使用的数据格式是json格式,为了使客户端与服务端有类对应关系,进行序列化,所以总要定义一些类,使用动态类型dynamic可以不必要定义那么多类. 测试代码: using Sy ...
- C# 匿名对象(匿名类型)、var、动态类型 dynamic——实用之:过滤类属性、字段实用dynamic
例子 返回一个LIst<oject>类型 而oject含有 30个字段 而我只需要两个字段.这里实用dynamic 和 linq. 上代码: 注意select new {} 为匿名类型,这 ...
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
比如有一个匿名对象,var result =......Select( a=>new { id=a.id, name=a.name});然后Object obj = result ;我怎 ...
- Java的动态代理(dynamic proxy)
什么是动态代理(dynamic proxy) 动态代理(以下称代理),利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对 ...
- .NET在EF中使用sql,用动态类吧!
.NET在EF中使用sql,用动态类吧! 前言 在.NET中使用Entity Framework能快速.方便地结合LINQ来对数据库进行一系列的增删改查操作.但是由于EF根据表达式最后生成通用的sql ...
- AS3.0的动态类和密封类
动态类:生成的实例可以在运行时动态添加属性和方法.类名前有dynamic就是动态类 密封类:生成的实例不可以在运行时动态添加属性和方法
- C# 匿名对象(匿名类型)、var、动态类型 dynamic
本文是要写的下篇<C#反射及优化用法>的前奏,不能算是下一篇文章的基础的基础吧,有兴趣的朋友可以关注一下. 随着C#的发展,该语音内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑. ...
- json.net(Json.NET - Newtonsoft)利用动态类解析json字符串
将对象转换为字符串很简单,唯一要注意的点就是为了避免循环要在需要的字段上添加jsonignore属性.可以参照这篇博文:http://www.mamicode.com/info-detail-1456 ...
随机推荐
- Unity3D-RPG项目实战(1):发动机的特殊文件夹
前言 从8月份開始.下定决心正式開始学习Unit3D啦.尽管自己写过两代端游引擎,被应用的项目也超过10个,Unreal Engine也搞过几年,只是做手游.哥确实还是个新手.Unity3D这个引擎我 ...
- StackExchange.Redis 使用
StackExchange.Redis 使用 - 事件(五) 摘要: ConnectionMultiplexer 可以注册如下事件ConfigurationChanged- 配置更改时Configur ...
- Vim 基本配置和经常使用的命令
vim 优势和应用场景 vim 的优点纯文字编辑和 Linux 完美的融合提供了命令行.只能假设 ssh 至server进行操作,那么这样的情况就仅仅能使用 vim 了.vim 也是最为强大的通用文本 ...
- js 滚轮事件 滚轮焦点图(轮播图)
利用滚轮,切换轮播图.附带mousewheel插件以及原生js写法: <!doctype html> <html> <head> <meta charse ...
- linux下一个php未找到php型材php.ini解决方案
编译并安装自己php经常会遇到这样的问题.我找不到php.ini.对于根据下面的方法可以解决例: 首先是需要解释.假设你php它被编译并安装,那么默认是没有php.ini的,你必须得去复制源代码包内. ...
- Hadoop0.20.2 Bloom filter应用演示样例
1. 简单介绍 參见<Hadoop in Action>P102 以及 <Hadoop实战(第2版)>(陆嘉恒)P69 2. 案例 网上大部分的说明不过依照<Hadoop ...
- mysql压力测试
1.采用 mysqlslap 压力测试 mysqlslap --defaults-file=/etc/my.cnf --concurrency=200 --iterations=1 --numbe ...
- Android开发在路上:少去踩坑,多走捷径(转)
最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1. 目前, Android APP开发完成后,通常需要在哪些机型上进行测试? 2. 目前, ...
- Word2vec 讨论
我没有在自然语言处理完成.但基于Deep Learning 关注,自然知道一些Word2vec强大. Word2vec 是google 在2013年提供的一款将词表征为实数值向量的高效工具.而Word ...
- 翻译器DIY它———算在英文文本中的单词数,字符和行数
咳咳.这部分应该是序列化编译器DIY的,然而,在这样做DIY第一次使用前flex 为了练练手,对于后者的理解是有帮助. 在word 我经常看到一个字计数功能,因此,它是如何实现,当然,首先想到的是要经 ...