访问搜狗游戏大厅网站:c#泛型和反射的设计应用-程序开发-红黑联盟

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 15:08:47

c#泛型和反射的设计应用
 
 
文章录入:浣花溪    责任编辑:snow  122 
 【字体:小 大】
 
From 心灵魔术师's blog
在设备操作面板的设计中总会有一类固定的按钮和操作惯例,但如果每做一个项目都写一套同样的代码实在很没效率的事。

    设备的操作按钮大多数都会包含启动、暂停、停止这三个按钮,软件界面中也同样需要这三类按钮,软件需要根据设备的状态

来禁用或启用不同的按钮组合。比如刚启动软件时,启动按钮开启,暂停和停止按钮禁用等等。

    一般设计情况下是用Button,也有的设计会用ToolStripButton,为了使其兼容更多的控件,所以采用了泛型。代码如下:

   
    public enum OperateState { Run, Pause, Stop };

    public class OperateStateRule where T : ToolStripItem
    {
        private T start;
        private T pause;
        private T stop;

        private OperateState state = OperateState.Stop;

        private OperateState State
        {
            get { return state; }
            //set { state = value; }
        }


        public OperateStateRule(T _start, T _pause, T _stop)
        {
            start = _start;
            pause = _pause;
            stop = _stop;

            Update(OperateState.Stop);
        }

        public void Update(OperateState _state)
        {
            state = _state;
            try
            {
                switch (state)
                {
                    case OperateState.Stop:
                        start.Enabled = true;
                        pause.Enabled = false;
                        stop.Enabled = false;
                        break;
                    case OperateState.Run:
                        start.Enabled = false;
                        pause.Enabled = true;
                        stop.Enabled = true;
                        break;
                    case OperateState.Pause:
                        start.Enabled = true;
                        pause.Enabled = false;
                        stop.Enabled = true);
                        break;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

    调用示例:

     ToolStripButton btnStart;
     ToolStripButton btnPause;
     ToolStripButton btnStop;

     //生成对象时绑定相应的按钮
     OperateStateRule rule = new  OperateStateRule(btnStart,btnPause,btnStop);
     //在Click事件里更新状态
      private void btnStart_Click(object sender, EventArgs e)
        {
            rule.Update(OperateState.Run);
        }

        private void btnPause_Click(object sender, EventArgs e)
        {
            rule.Update(OperateState.Pause);
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            rule.Update(OperateState.Stop);
        }
    

    在类声明上有个where T : ToolStripItem语句,这个是c#类型约束,如果不加这个约束,编译器会报错找不到Enabled属性,

但有个问题Button和ToolStripButton这两个类不是同一个基类派生,所以无法兼容使用这2个类,因为必须要有这个约束,使得c++

的一些泛型做法受到限制。

    那还有没有更好的方法来达到理想的效果呢,答案是有的,就是反射。看下面改进的代码例子:

    public enum OperateState { Run, Pause, Stop };

    public class OperateStateRule
    {
        private T start;
        private T pause;
        private T stop;

        private OperateState state = OperateState.Stop;

        private OperateState State
        {
            get { return state; }
            //set { state = value; }
        }


        public OperateStateRule(T _start, T _pause, T _stop)
        {
            start = _start;
            pause = _pause;
            stop = _stop;

            Update(OperateState.Stop);
        }
        //通过反射设置属性值
        private void SetEnabled(T obj, bool value)
        {
            obj.GetType().InvokeMember("Enabled", BindingFlags.SetProperty, null, obj, new object[] { value});
        }
        public void Update(OperateState _state)
        {
            state = _state;
            try
            {
                switch (state)
                {
                    case OperateState.Stop:
                        SetEnabled(start, true);
                        SetEnabled(pause, false);
                        SetEnabled(stop, false);
                        break;
                    case OperateState.Run:
                        SetEnabled(start, false);
                        SetEnabled(pause, true);
                        SetEnabled(stop, true);
                        break;
                    case OperateState.Pause:
                        SetEnabled(start, true);
                        SetEnabled(pause, false);
                        SetEnabled(stop, true);
                        break;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
   
    可以看到已经不需要where子句来约束类型,通过借助泛型和反射实现了更好通用性,不但能使用Button和ToolStripButton,

还能使用其他的控件,只要有Enabled属性即可。
 

摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/kf/201002/44832.html

c#泛型和反射的设计应用-程序开发-红黑联盟 C#反射的理解-程序开发-红黑联盟 使用C#多线程设计的电脑摇奖程序-程序开发-红黑联盟 用设计模式固化你的C#程序(2)-程序开发-红黑联盟 用设计模式固化你的C#程序(3)-程序开发-红黑联盟 C# Socket多线程编程实例-程序开发-红黑联盟 C# 清理IE缓存文件实例代码-程序开发-红黑联盟 C# 清理Cookies文件实例代码-程序开发-红黑联盟 到底是什么反射,泛型,委托,泛型-程序开发-红黑联盟 多线程下载(FtpWebRequest)-程序开发-红黑联盟 Asp.net常用的操作函数-程序开发-红黑联盟 10个常用方法有效优化ASP.NET的性能-程序开发-红黑联盟 介绍asp.net正则表达式的组集合-程序开发-红黑联盟 Asp.Nne 编程常用的二十六个函数详解-程序开发-红黑联盟 掌握Asp.Net编程语言的九大步骤-程序开发-红黑联盟 Asp.net网站性能优化二则-程序开发-红黑联盟 提高网站速度:ASP.NET缓存详解-程序开发-红黑联盟 c#的反射 世纪开发网(广州市中强电子科技有限公司)—应用设计-单片机源程序 -PID处理程序(C51... 开机自动扫描故障的解决办法|网络&系统 - 红黑联盟论坛 - Powered by php... 笔记本键盘上的Fn键作用-网管-红黑联盟 界面设计、交互设计及程序开发(一) C#反射教程(2)--Asp.Net/C#/WCF--编程设计网 C#反射教程(3)--Asp.Net/C#/WCF--编程设计网