这个特性是从.Net3.5的时候开始出现的,是指在原有类中插入一个方法,用于给原有类扩展新的功能的方法。给我的感觉就是有点类似于插件的意思。
比如下面的代码:
1 namespace ExtendFunction
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 DateTime _now=DateTime.Now;
8 Console.Write(_now.TO_CH());
9 Console.ReadKey();
10 }
11 }
12 static class ExtClass
13 {
14 public static string TO_CH(this DateTime _dt)
15 {
16 return _dt.ToString("当前时间:yyyy年MM月dd日 HH:mm:ss");
17 }
18 }
19 }
虽然我上面的代码有鸡肋的嫌疑,但是至少能说明什么是扩展方法。很明显,正常的DateTime中是不会有TO_CH方法的,我在下面通过ExtClass给DateTime插入了一个新的方法,然后DateTime中就有了这样一个方法了。我这里只是举一个例子而已,理论上可以给任意的方法进行扩展。我尝试在WPF中扩展TextBlack类,我要的目的是在指定时间内,使用BackgroundWorker自动更新内容,但是遭遇了跨线程的问题。我没找到是为什么,所以我做了小小更改,还是一个鸡肋的功能,使用WPF+BackgroundWorker+扩展方法做一个小DEMO,更新时间(= =|||我感觉更鸡肋了)。。。
那么扩展方法我写成了这样:
1 public static class ExtFunc
2 {
3 public static void Async(this TextBlock t, TimeSpan Interval)
4 {
5 BackgroundWorker bw = new BackgroundWorker();
6 bw.DoWork += new DoWorkEventHandler(new Action<object, DoWorkEventArgs>((obj, e) =>
7 {
8 t.Dispatcher.BeginInvoke(new Action(() =>
9 {
10 t.Inlines.Clear();
11 t.Inlines.Add(new Run(DateTime.Now.ToString("当前时间:yyyy-MM-dd HH:mm:ss")));
12 }));
13 }));
14 bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(new Action<object, RunWorkerCompletedEventArgs>((sender, e) =>
15 {
16
17 }));
18 new DispatcherTimer(Interval, DispatcherPriority.Loaded, new EventHandler(new Action<object, EventArgs>((sender, e) =>
19 {
20 if (!bw.IsBusy)
21 {
22 bw.RunWorkerAsync(t);
23 }
24 })), t.Dispatcher).Start();
25 }
26 }
说实话,我觉得上面这段代码都有JSON的风格了,开个玩笑,只是我喜欢做一些非常规的事情而已,上面只是用到了一些新特性而已和匿名类而已,我想如果有人能轻松的阅读我的代码,那么估计不是高手也是熟练吧,我倒不是说是我写的代码有多么好,而是我写的很乱。
XAML的前台只需要一个TextBlock配合,我这里不写多了,就一句,具体在哪用,看你的需要了。
<TextBlock Canvas.Left="66" Canvas.Top="7" Height="23" Name="_t" Text="" Width="643" FontSize="14"/>
但是需要还需要在XAML的cs代码中写一句,你可以放在按钮事件里,也可以放在Window_Loaded事件中,我放在了Window_Loaded事件中。
_t.Async(new TimeSpan(0, 0, 1));
跟新时间,间隔1秒。
虽然用处不大,但是如果能帮助你学习,那么就可以了,高手无视掉吧。
http://luacloud.com/2011/csharp-wpf-extend-function.html