用户界面的可配置解决方案

.net的反射以及用户界面的可配置性在一段200行的代码中体现的淋漓尽致。
只需要两个类,两个配置文件。
首先看一下配置文件的结构吧。
ControlColor.xml中定义了控件的名称、种类以及颜色。
        <Control>
                <ControlType>SwitchTextLabel</ControlType>
                <ControlName>TxtPassword</ControlName>
                <Color>black,yellow,pink,white</Color>
        </Control>
ControlType.xml中定义了控件的类型、颜色属性以及对应的lib库。
        <Control>
                <ControlType>SwitchTextLabel</ControlType>
                <Lib>switchtextlabel.dll</Lib>
                <Property>TextBackColor</Property>
                <Property>TextForeColor</Property>
                <Property>LabelBackColor</Property>
                <Property>LabelForeColor</Property>
        </Control>

剩余的就是两个类了,其实是很简单的东西。XmlReader就是能把这两个XML文件正确的对应起来并能够准确的取出相应值的类。
重要的是FormUtil这个类。
方法getAllSubControls()就是得到某一个控件内所有的子控件,递归实现的。
看方法setObjProperty。

 1              string  type  =  colorList[ 0 ].ToString();
 2              string [] color  =  colorList[ 1 ].ToString().Split( ' , ' );
 3              string [] property  =  propertyList[ 0 ].ToString().Split( ' , ' );
 4              string  lib  =  propertyList[ 1 ].ToString();
 5
 6             Type tp  =  System.Type.GetType(type);
 7              if  (tp  ==   null )
 8              {
 9                Assembly ass = Assembly.LoadFrom(lib);//这个lib就是配置文件ControlType.xml中的Lib
10                tp = ass.GetType(type, truetrue);
11            }

12
13              for  ( int  i  =   0 ; i  <  color.Length; i ++ )
14              {
15                if (property.Length > i)
16                {
17                    if (property[i] != "")
18                    {
19                        Object[] args = new object[1];
20                        args[0= Color.FromName(color[i]);
21
22                        tp.InvokeMember(property[i], BindingFlags.Public | BindingFlags.Instance | 
                                                                BindingFlags.SetProperty,Type.DefaultBinder, c, args);
23                    }

24                }

25            }

26

 OK,一切OK。
不过有一点就是需要在每一个Form初始化的时候加上FormUtil的引用,可以说这也是一种装饰模式,保持了一个对Form的引用,但是面向对象的思想继承优先,而不是耦合优先,但是对于已经不能改动的代码这确实是最好的解决办法,如果是可以修改代码呢?抽象父类是否可以更好的解决呢?
这个问题就先放着吧。
已有的解决办法是通过反射实现的,效率可能存在一些问题,但是却是比较好的,因为这样不仅是Color,连别的属性都可以设置,只要再配置文件中做好了配置,并且在FormUtil加入相应的方法,都是可以的。

这确实是一个很不错的解决方案。

转载于:https://www.cnblogs.com/game-over/articles/894308.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值