这个特性是从.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秒。
虽然用处不大,但是如果能帮助你学习,那么就可以了,高手无视掉吧。