• C#中的扩展方法


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






  • 相关阅读:
    24点游戏 程序(一)
    24点游戏全解-1362组
    Android版 hanoi 汉诺塔 源码
    24点游戏 程序(二)
    Javascript 面向对象编程
    新浪微博 OAuth2 NodeJs发微博
    AT5800 [AGC043C] Giant Graph 题解
    CF1033D Divisors 题解
    CF1033E Hidden Bipartite Graph 题解
    AT???? [ABC255D] String Cards 题解
  • 原文地址:https://www.cnblogs.com/luacloud/p/2263315.html
Copyright © 2020-2023  润新知