亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Dynamic

2019-11-17 02:52:43
字體:
來源:轉載
供稿:網友

Dynamic - ExpandoObject學習心得

2014-09-19 20:49 by zhang carl, ... 閱讀, ... 評論, 收藏, 編輯

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 = 25;            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 = 25;            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 = 0; i < 5; i++)            {                dynamic dynObj = new ExpandoObject();                dynObj.Test1 = string.Format("Zhangyida{0}", i);                dynObj.Test2 = 25 + 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 = 100;                }            }        }

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 = 10;            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>

效果圖

說明:大家可以從上圖中看到

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91嫩草在线视频| 久久夜色精品亚洲噜噜国产mv| 亚洲成人久久一区| 亚洲欧美在线免费观看| 国产精品久久久精品| 欧美在线免费视频| 日韩成人网免费视频| 亚洲欧美日韩成人| 日韩电影免费观看在线| 欧美野外wwwxxx| xxxx欧美18另类的高清| 亚洲全黄一级网站| 久久福利视频网| 色妞色视频一区二区三区四区| 中文字幕视频一区二区在线有码| 日韩亚洲欧美中文高清在线| 久久久黄色av| 亚洲福利视频免费观看| 一区二区三区美女xx视频| 视频在线观看99| 日韩电影中文 亚洲精品乱码| 亚洲精品日韩在线| 日韩国产在线播放| 国产精品自产拍在线观| 日韩精品日韩在线观看| 另类美女黄大片| 亚洲美腿欧美激情另类| 欧洲s码亚洲m码精品一区| 成人免费黄色网| 97视频在线免费观看| 久久亚洲春色中文字幕| 亚洲最大的免费| 成人精品网站在线观看| 北条麻妃一区二区三区中文字幕| 中文字幕亚洲专区| 国产精品久久激情| 欧美成人精品h版在线观看| 久久91亚洲人成电影网站| 久久中国妇女中文字幕| 成人福利网站在线观看| 欧美日韩在线看| 精品中文字幕在线| 国产精品网站大全| 亚洲色图15p| 中日韩美女免费视频网站在线观看| 欧美xxxx做受欧美| 久久久久久国产精品美女| 日韩在线观看免费高清| 在线观看91久久久久久| 日韩免费观看网站| 97人人爽人人喊人人模波多| 国产亚洲精品久久久优势| 精品亚洲va在线va天堂资源站| 亚洲a成v人在线观看| 色婷婷成人综合| 国产欧美一区二区三区在线| 亚洲激情小视频| 国产日本欧美视频| 另类天堂视频在线观看| 国产区精品在线观看| 国产区精品在线观看| 欧美韩国理论所午夜片917电影| 欧美成人一二三| 欧美有码在线观看视频| 欧美美女15p| 亚洲最大在线视频| 色多多国产成人永久免费网站| 91精品久久久久久久久久久久久久| 国产丝袜一区二区三区免费视频| 欧美日韩亚洲91| 4k岛国日韩精品**专区| 亚洲视频axxx| 中国china体内裑精亚洲片| 国产一区二区免费| 欧美国产亚洲视频| 亚洲国产欧美日韩精品| 日韩成人av一区| 蜜臀久久99精品久久久无需会员| 久久久综合av| 国产日韩欧美在线视频观看| 91视频免费网站| 国产精品视频导航| www高清在线视频日韩欧美| 国产福利视频一区二区| 国产精品伦子伦免费视频| 日韩美女在线观看一区| 成人免费淫片aa视频免费| 中文字幕免费国产精品| 欲色天天网综合久久| 亚州欧美日韩中文视频| 综合国产在线视频| 亚洲视频在线观看免费| 久久精品国产亚洲一区二区| 欧美日韩国产激情| 欧美麻豆久久久久久中文| 亚洲自拍偷拍区| 精品国产区一区二区三区在线观看| 国产精品美女免费看| 国产精品一区二区久久精品| 日韩成人网免费视频| 黄色成人在线免费| 亚洲欧美日韩精品| 亚洲人成毛片在线播放| 欧美国产日韩一区二区| 91久久久久久久久久| 国产精品视频资源| 久久av资源网站| 欧美日韩精品在线播放| 91色在线视频| 亚洲色图25p| 性色av一区二区三区| 国产精品大片wwwwww| 欧美电影在线观看高清| 国产精品三级美女白浆呻吟| 久久97精品久久久久久久不卡| 国产精品影院在线观看| 国产91露脸中文字幕在线| 日本精品中文字幕| 国产精品久久久久久久av大片| 中文字幕精品久久久久| 日韩欧美国产高清91| www.亚洲男人天堂| 操91在线视频| 国产精品美女网站| 国产精品私拍pans大尺度在线| 91精品啪aⅴ在线观看国产| 精品视频偷偷看在线观看| 久久国产精品久久久久久| 亚州欧美日韩中文视频| 日韩小视频在线| 97精品久久久| 成人精品视频99在线观看免费| 国产女人精品视频| 亚洲人成电影在线| 欧美亚洲午夜视频在线观看| 国产亚洲欧美日韩美女| 日韩欧美中文免费| 亚洲视频在线播放| 北条麻妃在线一区二区| 亚洲自拍偷拍福利| 亚洲性69xxxbbb| 欧美黑人视频一区| 久久琪琪电影院| 欧美在线激情网| 久久久久一本一区二区青青蜜月| 欧美中在线观看| 久久精品亚洲国产| 国产欧美va欧美va香蕉在线| 亚洲国产精品久久久| 国产精品爽爽爽| 少妇高潮久久77777| 国产精品美女www爽爽爽视频| 不用播放器成人网| 成人福利视频网| 亚洲www在线观看| 91免费的视频在线播放| 亚洲国产成人精品电影| 国产精品亚洲аv天堂网| 日韩精品中文字幕有码专区| www.亚洲天堂| 国产日韩中文在线| 亚洲欧美国产精品久久久久久久| 韩国国内大量揄拍精品视频| 日本一区二区在线播放|