博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#中的扩展方法

Posted on 2012-02-14 10:31  十一郞  阅读(258)  评论(0编辑  收藏  举报

这个特性是从.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