1、  今天下午在做开发过程中,遇到了一个问题,要往Xml文件中添加新的节点,做个xml开发的都知道该怎么做,这不是什么难事,我卡卡卡卡把这个问题解决了,但是新问题又来了,要对xml中对应的节点数据添加属性更改通知功能???我一听到这个需求就蒙了,我上哪去给xml节点数据整TMD属性更改通知啊。哎。。。。。没办法了,胳膊拧不过大腿啊,只能硬着头皮上咯。

2、  通过google、bing、百度的搜索,主要让我发现了有个神奇的玩意,那就是ExpandoObject类型,ExpandoObject归属于动态类型,之前只是听说过动态类型,但是一直都只是停留在听说阶段,今天为了解决这个问题终于可以来接近久仰已久的Dynamic了。要学习.net的新东西,肯定是去MSDN找咯,在msdn上看到关于Dynamic的介绍非常齐全,内容非常之多,今天我主要研究的是ExpandoObject。于是我就从最简单的用法开始,自己动手一步步写代码尝试。

现在开始我第一段代码:

C#代码:

    public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
dynamic dynObject = new ExpandoObject();
dynObject.Name = "张益达";
dynObject.Age = ;
dynObject.Time = DateTime.Now;
this.DataContext = dynObject;
}
}

xaml代码:

<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<Button Width="80" Height="30" Content="按钮1" Click="ButtonBase_OnClick"></Button>
<TextBlock Text="{Binding Path=Name}"></TextBlock>
<TextBox Text="{Binding Path=Age, Mode=TwoWay}"></TextBox>
<TextBlock Text="{Binding Path=Time}"></TextBlock>
</StackPanel>
</Grid>
</Window>

效果图:

说明:

这里就可看出Dynamic的神奇之处了,我没有定义个类型,也没有定义Name、Age、Time这些属性,没错,这就是动态类型的功劳了,它能把我的Name、Age、Time在运行时解析成相应的类型,并且通过前台的数据绑定,把数据显示出来。

第二段代码:

C#代码:

    public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} dynamic dynObject = new ExpandoObject(); private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{ dynObject.Name = "张益达";
dynObject.Age = ;
dynObject.Time = DateTime.Now;
this.DataContext = dynObject;
} private void ButtonBase1_OnClick(object sender, RoutedEventArgs e)
{
string newName = dynObject.Name;
string age = dynObject.Age;
}
}

xaml代码:

<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<Button Width="80" Height="30" Content="按钮1" Click="ButtonBase_OnClick"></Button>
<Button Width="80" Height="30" Content="按钮2" Click="ButtonBase1_OnClick"></Button>
<TextBlock Text="{Binding Path=Name}"></TextBlock>
<TextBox Text="{Binding Path=Age, Mode=TwoWay}"></TextBox>
<TextBlock Text="{Binding Path=Time}"></TextBlock>
</StackPanel>
</Grid>
</Window>

效果图:

说明:

运行起来先点击 按钮1 然后改变Age的值(从25改成100),再点 按钮2,断点截图中可以看到dynObject.Age的值已经自动变成120,!!!!天啊,这是多么神奇的事啊,值就那么轻易的自己改变了,这不就是要想要的属相自动更改吗?这倒是是真么发生的呢,其实这一切都是ExpandoObject的功劳,不准确的说应该是INotifyPropertyChanged的功劳,为什么这么说呢,在ExpandoObject上按F12看看究竟把:

有了这幅图就能说明一切了,ExpandoObject是多么强大啊,它既是动态类,又是字典、集合、最最关键的他还有属性更改通知。

第三段代码

C#代码:

        ObservableCollection<ExpandoObject> source = new ObservableCollection<ExpandoObject>();
private void ButtonBase3_OnClick(object sender, RoutedEventArgs e)
{
for (int i = ; i < ; i++)
{
dynamic dynObj = new ExpandoObject();
dynObj.Test1 = string.Format("Zhangyida{0}", i);
dynObj.Test2 = + i;
dynObj.Test3 = DateTime.Now.ToString();
dynObj.IsCheck = false;
source.Add(dynObj);
}
this.DataGrid1.ItemsSource = source;
} private void ButtonBase4_OnClick(object sender, RoutedEventArgs e)
{
var sourc = source;
foreach (dynamic item in source)
{
item.IsCheck = false;
if (item.Test1 == "Zhangyida1")
{
item.Test2 = ;
}
}
}

Xaml代码

  <Button Width="80" Height="30" Content="按钮3" Click="ButtonBase3_OnClick"></Button>
<Button Width="80" Height="30" Content="按钮4" Click="ButtonBase4_OnClick"></Button>
<DataGrid Name="DataGrid1">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Test1}"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Test2}"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Test3}"></DataGridTextColumn>
<DataGridCheckBoxColumn Binding="{Binding Path=IsCheck}"></DataGridCheckBoxColumn>
</DataGrid.Columns>
</DataGrid>

效果图:

点击 按钮3:

点击按钮4:

说明:

注意喔,大家看仔细了,看看两幅图的区别,这是通过一个集合来进一步使用了ExpandoObject属性更改通知

这时候我突然有个一个想法,既然动态类型可以动态的添加属性,那么能不能让我定义的一般实体类也可以有这种功能呢,查看了MSDN发现这个事有搞头,让我的实体类来继承DynamicObject,然后再做并从新实现TrySetMember,大家先看看代码吧

    public class DynamicUser : DynamicObject
{
private IDictionary<string, object> dictionary = new ExpandoObject(); public int Count
{
get { return dictionary.Count; }
} public override bool TryGetMember(GetMemberBinder binder, out object result)
{
string name = binder.Name;
return dictionary.TryGetValue(name, out result);
} public override bool TrySetMember(SetMemberBinder binder, object value)
{
dictionary[binder.Name] = value;
return true;
} public int Age { get; set; } public string Name { get; set; } public DateTime Time { get; set; }
}

这是我的动态实体类,默认有三个字段Age 、Name、Time字段,其实动态添加的属性,我都把它放到了一个Dictionary里面,而且这是个ExpandoObject的字典。

C#代码:

        dynamic dynUser = new DynamicUser();
private void ButtonBase5_OnClick(object sender, RoutedEventArgs e)
{
dynUser.Age = ;
dynUser.Name = "张伟";
dynUser.Time = DateTime.Now;
dynUser.ABC = "ddddd";
var ok = dynUser; this.DataContext = dynUser;
} private void ButtonBase6_OnClick(object sender, RoutedEventArgs e)
{
var user = dynUser;
}

Xaml代码:

    <Button Width="80" Height="30" Content="按钮5" Click="ButtonBase5_OnClick"></Button>
<Button Width="80" Height="30" Content="按钮6" Click="ButtonBase6_OnClick"></Button>

效果图

说明:大家可以从上图中看到dynUser已经有了ABC了,而且ABC的用法和属性的用法一模一样。

源代码下载  http://files.cnblogs.com/zwzw/source.rar

Dynamic - ExpandoObject学习心得的更多相关文章

  1. windows类书的学习心得(转载)

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  2. windows类书的学习心得

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  3. folly学习心得(转)

    原文地址:  https://www.cnblogs.com/Leo_wl/archive/2012/06/27/2566346.html   阅读目录 学习代码库的一般步骤 folly库的学习心得 ...

  4. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  5. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  6. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  7. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  8. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  9. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

随机推荐

  1. Java最重要的21个技术点和知识点之JAVA基础

     (一)Java最重要的21个技术点和知识点之JAVA基础  写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Ja ...

  2. JavaScript随机数

    function random(start,end){ var total=start+end; return Manth.floor(Manth.random()+total-start); }

  3. C语言中将数字转换为字符串的方法

    C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串.以下是用itoa()函数将整数转换为字符串的一个例子: # include <stdio. h># ...

  4. JavaScript组成

    JavaScript由ECMAScript,Dom,Bom三部分组成. ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufa ...

  5. PetaPOCO 一对多 多对一 多对多

    PetaPoco支持将结果集中的一行映射到到两个以及更多POCO,但是如何处理一对多和多对多关系? 1.PetaPoco 支持将结果映射为多个POCO类型,提供了另一种方法来处理SQL的Join查询. ...

  6. MySQL(26):事务的隔离级别出现问题之 幻读

    1. 幻读 幻读(Phantom Read)又称为虚读,是指在一个事务内两次查询中数据条数不一致,幻读和不重复读有些类型,同样是在两次查询过程中,不同的是,幻读是由于其他事务做了插入记录的操作,导致记 ...

  7. VS2013 支持python和nodejs

    一.在VS2013中,安装python的支持 1. http://pytools.codeplex.com/下载插件 2. https://www.python.org/download/下载Pyth ...

  8. vb.net详解MDI窗体操作方法

    MDI窗体可以避免打开窗体的时候被无数个子窗体困扰,我将为大家一一的介绍一下vb.net中MDI窗体的操作方法 一.如何创建MDI窗体? 1.创建mdi主窗体 新建建立一个默认空白的Windows应用 ...

  9. Oracle基础<1>--数据库设计

    一:为什么需要使用数据库设计 数据库设计可以使数据库通过健壮的数据库结构  高效并且健康  的进行工作. 二.数据库设计原则 (数据库设计.系统设计.架构设计) 1.熟悉需求 保证之后需求的变更 不会 ...

  10. 修改tomcat浏览器地址栏图标

    1.准备一张jpg格式的图片 2.去百度:ico图标在线制作(快速入口:http://www.faviconico.org/) 3.将生成的ico图标复制到tomcat的webapps下的ROOT项目 ...