using System;
using System.Collections.Generic;
using System.Linq;
using System.Drawing;
using System.Text;
using System.Xml;
using System.IO;
using ICSharpCode.Core;
using System.Reflection;

namespace Mesnac.Basic
{
    #region XML操作主类
    /// <summary>
    /// XML解析类
    /// </summary>
    public class XmlHandler
    {
        #region 平台设计环境下对XML操作的主要方法
        /// <summary>
        /// 解析工程向导文件
        /// </summary>
        /// <param name="fileName">工程向导文件</param>
        /// <returns></returns>
        public static Dictionary<string, ProjectWizard> ParseFromProjectWizardXml(string fileName)
        {
            Dictionary<string, ProjectWizard> dic = new Dictionary<string, ProjectWizard>();
            if (File.Exists(fileName))
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(fileName);
                XmlNodeList nodeListProjectWizard = doc.GetElementsByTagName("ProjectWizard");
                ProjectWizard projectWizard = null;
                foreach (XmlNode node in nodeListProjectWizard)
                {
                    projectWizard = new ProjectWizard();
                    projectWizard.Name = node.Attributes["Name"].Value;
                    projectWizard.EnglishName = node.Attributes["EnglishName"].Value;
                    projectWizard.EnglishShortName = node.Attributes["EnglishShortName"].Value;
                    projectWizard.ImageIndex = String.IsNullOrWhiteSpace(node.Attributes["ImageIndex"].Value) ? -1 : Convert.ToInt32(node.Attributes["ImageIndex"].Value);
                    projectWizard.Description = node.Attributes["Description"].Value;
                    projectWizard.EnglishDescription = node.Attributes["EnglishDescription"].Value;
                    dic.Add(projectWizard.Name, projectWizard);
                }
            }
            return dic;
        }
        /// <summary>
        /// 解析数据源文件
        /// </summary>
        /// <param name="fileName">数据源文件</param>
        /// <returns>数据源集合</returns>
        public static Dictionary<string, DataSourceItem> ParseFromDataSourceXml(string fileName)
        {
            Dictionary<string, DataSourceItem> dic = new Dictionary<string, DataSourceItem>();
            if (File.Exists(fileName))
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(fileName);
                XmlNodeList nodeListDataSource = doc.GetElementsByTagName("DataSourceItem");
                DataSourceItem dataSourceItem = null;
                foreach (XmlNode node in nodeListDataSource)
                {
                    dataSourceItem = new DataSourceItem();
                    dataSourceItem.Name = node.Attributes["Name"].Value;
                    dataSourceItem.Driver = node.Attributes["Driver"].Value;
                    dataSourceItem.Server = node.Attributes["Server"].Value;
                    dataSourceItem.UserName = node.Attributes["UserName"].Value;
                    dataSourceItem.Password = node.Attributes["Password"].Value;
                    dataSourceItem.Database = node.Attributes["DataBase"].Value;
                    dataSourceItem.ConnectionTimeout = GetAttributeIntValue(node, "ConnectionTimeout", 5);      //默认连接超时
                    dataSourceItem.DriverAssembly = node.Attributes["DriverAssembly"].Value;
                    dataSourceItem.DriverClass = node.Attributes["DriverClass"].Value;
                    dataSourceItem.DataSourceClass = node.Attributes["DataSourceClass"].Value;
                    dic.Add(dataSourceItem.Name, dataSourceItem);
                }
            }
            return dic;
        }
        /// <summary>
        /// 生成数据源配置文件
        /// </summary>
        /// <param name="dic">数据源集合</param>
        /// <param name="fileName">数据源文件</param>
        public static void GenerateDataSourceXml(Dictionary<string, DataSourceItem> dic, string fileName)
        {
            XmlDocument doc = new XmlDocument();
            XmlElement eroot = doc.CreateElement("DataSources");
            foreach (DataSourceItem dataSourceItem in dic.Values)
            {
                XmlElement eDataSourceItem = doc.CreateElement("DataSourceItem");

                XmlAttribute attName = doc.CreateAttribute("Name");
                attName.Value = dataSourceItem.Name;
                eDataSourceItem.Attributes.Append(attName);

                XmlAttribute attDriver = doc.CreateAttribute("Driver");
                attDriver.Value = dataSourceItem.Driver;
                eDataSourceItem.Attributes.Append(attDriver);

                XmlAttribute attServer = doc.CreateAttribute("Server");
                attServer.Value = dataSourceItem.Server;
                eDataSourceItem.Attributes.Append(attServer);

                XmlAttribute attUserName = doc.CreateAttribute("UserName");
                attUserName.Value = dataSourceItem.UserName;
                eDataSourceItem.Attributes.Append(attUserName);

                XmlAttribute attPassword = doc.CreateAttribute("Password");
                attPassword.Value = dataSourceItem.Password;
                eDataSourceItem.Attributes.Append(attPassword);

                XmlAttribute attDataBase = doc.CreateAttribute("DataBase");
                attDataBase.Value = dataSourceItem.Database;
                eDataSourceItem.Attributes.Append(attDataBase);

                XmlAttribute attConnectionTimeout = doc.CreateAttribute("ConnectionTimeout");
                attConnectionTimeout.Value = dataSourceItem.ConnectionTimeout.ToString();
                eDataSourceItem.Attributes.Append(attConnectionTimeout);

                XmlAttribute attDriverAssembly = doc.CreateAttribute("DriverAssembly");
                attDriverAssembly.Value = dataSourceItem.DriverAssembly;
                eDataSourceItem.Attributes.Append(attDriverAssembly);

                XmlAttribute attDriverClass = doc.CreateAttribute("DriverClass");
                attDriverClass.Value = dataSourceItem.DriverClass;
                eDataSourceItem.Attributes.Append(attDriverClass);

                XmlAttribute attDataSourceClass = doc.CreateAttribute("DataSourceClass");
                attDataSourceClass.Value = dataSourceItem.DataSourceClass;
                eDataSourceItem.Attributes.Append(attDataSourceClass);

                eroot.AppendChild(eDataSourceItem);
            }
            doc.AppendChild(eroot);
            doc.Save(fileName);
        }

        /// <summary>
        /// 解析画面文件
        /// </summary>
        /// <param name="fileName">画面文件名</param>
        /// <returns></returns>
        public static Dictionary<string, ObjectDescriptor> ParseFormXml(string fileName)
        {
            Dictionary<string, ObjectDescriptor> dic = new Dictionary<string, ObjectDescriptor>();
            if (File.Exists(fileName))
            {
                XmlDocument doc = ReadXmlFile(fileName);
                XmlNodeList nodeListObject = doc.GetElementsByTagName("Object");
                ObjectDescriptor objectDescriptor = null;
                foreach (XmlNode node1 in nodeListObject)
                {
                    objectDescriptor = new ObjectDescriptor();
                    objectDescriptor.Name = node1.Attributes["name"].Value;
                    if (dic.ContainsKey(objectDescriptor.Name))
                    {
                        continue;
                    }
                    if (node1.ParentNode != node1.OwnerDocument && node1.ParentNode.Attributes["name"] != null)
                    {
                        objectDescriptor.ParentName = node1.ParentNode.Attributes["name"].Value;
                    }

                    XmlNodeList nodeListProperty = node1.ChildNodes;

                    foreach (XmlNode node2 in nodeListProperty)
                    {
                        if (node2.Name == "Property")
                        {
                            objectDescriptor.Properties.Add(node2.Attributes["name"].Value);
                        }
                    }

                    dic.Add(node1.Attributes["name"].Value, objectDescriptor);
                }
                System.GC.Collect();        //回收内存
            }

            return dic;
        }

        #endregion

        #region 平台运行环境下对XML操作的主要方法
        
        /// <summary>
        /// 获取组态工程目录下所有的DLL集合
        /// </summary>
        /// <param name="mcProjectPath">组态工程目录(.mprj文件所在目录)</param>
        /// <returns>返回DLL集合</returns>
        public static Dictionary<string, string> GetProjectDLLNode(string mcProjectPath)
        {
            Dictionary<string, string> formsDic = new Dictionary<string, string>();
            string formListPath = mcProjectPath + "\\extend\\";
            if (Directory.Exists(formListPath))
            {
                DirectoryInfo formsDir = new DirectoryInfo(formListPath);
                foreach (FileInfo item in formsDir.GetFiles("*.dll"))
                {
                    formsDic.Add(Path.GetFileNameWithoutExtension(item.Name), GetFormTextFromDLL(Path.GetFileNameWithoutExtension(item.Name),item.FullName));
                }
            }
            return formsDic;
        }

        /// <summary>
        /// 获取组态工程目录下所有的画面集合
        /// </summary>
        /// <param name="mcProjectPath">组态工程目录(.mprj文件所在目录)</param>
        /// <returns>返回画面集合</returns>
        public static Dictionary<string, string> GetProjectFormNode(string mcProjectPath)
        {
            Dictionary<string, string> formsDic = new Dictionary<string, string>();
            string formListPath = Path.Combine(mcProjectPath, FixNodeName.NodeFormName);
            if (Directory.Exists(formListPath))
            {
                DirectoryInfo formsDir = new DirectoryInfo(formListPath);
                foreach (FileInfo item in formsDir.GetFiles("*.xml",SearchOption.TopDirectoryOnly))
                {
                    formsDic.Add(Path.GetFileNameWithoutExtension(item.Name), GetFormText(item.FullName));
                }
            }
            return formsDic;
        }
        /// <summary>
        /// 获取工程命令列表
        /// </summary>
        /// <param name="mcProjectPath">工程路径</param>
        /// <returns>返回工程命令集合</returns>
        public static Dictionary<string, List<string>> GetProjectCommands(string mcProjectPath)
        {
            Dictionary<string, List<string>> commandsDic = new Dictionary<string, List<string>>();
            string commandListPath = Path.Combine(mcProjectPath, FixNodeName.NodeCommandName + ".xml");
            if (File.Exists(commandListPath))
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(commandListPath);
                XmlNodeList nodeList = doc.GetElementsByTagName("Property");
                List<string> valueList = null;
                foreach (XmlNode node in nodeList)
                {
                    string key = node.Attributes["actionname"].Value;
                    if (!commandsDic.ContainsKey(key))
                    {
                        valueList = new List<string>();
                        valueList.Add(node.Attributes["guid"].Value);
                        commandsDic.Add(key, valueList);
                    }
                    else
                    {
                        commandsDic[key].Add(node.Attributes["guid"].Value);
                    }
                }
            }
            return commandsDic;
        }
        /// <summary>
        /// 获取组态工程目录下所有的画面菜单集合
        /// </summary>
        /// <param name="mcProjectPath">组态工程目录(.mprj文件所在目录)</param>
        /// <returns>返回画面菜单集合</returns>
        public static List<RunConfigMenuItem> GetProjectFormMenus(string mcProjectPath)
        {
            Dictionary<string, string> formsDic = GetProjectFormNode(mcProjectPath);
            List<RunConfigMenuItem> lst = new List<RunConfigMenuItem>();
            RunConfigMenuItem menuItem = null;
            foreach (string key in formsDic.Keys)
            {
                menuItem = new RunConfigMenuItem();
                menuItem.FormFile = key;
                menuItem.ID = key;
                menuItem.FormText = formsDic[key];
                menuItem.Text = formsDic[key];
                menuItem.IsSystem = false;
                lst.Add(menuItem);
            }

            Dictionary<string, List<string>> commandsDic = GetProjectCommands(mcProjectPath);
            foreach (string key in commandsDic.Keys)
            {
                menuItem = new RunConfigMenuItem();
                menuItem.ID = "Command_" + key;
                menuItem.FormText = key;
                menuItem.Text = key;
                menuItem.CreateType = CreateType.Command;
                menuItem.CommandValue = commandsDic[key];
                menuItem.IsSystem = false;
                lst.Add(menuItem);
            }

            Dictionary<string, string> formsDll = GetProjectDLLNode(mcProjectPath);
            foreach (string key in formsDll.Keys)
            {
                menuItem = new RunConfigMenuItem();
                menuItem.FormFile = key;
                menuItem.ID = "dll_" + key;
                menuItem.FormText = formsDll[key];
                menuItem.Text = formsDll[key];
                menuItem.IsSystem = false;
                lst.Add(menuItem);
            }

            return lst;
        }

        /// <summary>
        /// 获取画面文件中窗体的Text属性值
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        private static string GetFormText(string fileName)
        {
            string returnstr = String.Empty;
            XmlDocument doc = ReadXmlFile(fileName);
            XmlNode formNode = doc.SelectSingleNode("DOCUMENT_ELEMENT/Object");
            foreach (XmlNode item in formNode.ChildNodes)
            {
                if (item.Name == "Property" && item.Attributes["name"].InnerText == "Text")
                {
                    returnstr = item.InnerText;
                }
            }
            return returnstr;
        }

        /// <summary>
        /// 获取DLL文件中窗体的FormName属性值
        /// </summary>
        /// <param name="fileName">不带扩展名的文件名称</param>
        /// <param name="fileFullName">文件全路径名称</param>
        /// <returns></returns>
        private static string GetFormTextFromDLL(string fileName,string fileFullName)
        {
            string returnstr = String.Empty;
            Assembly ass = Assembly.LoadFrom(fileFullName);
            Type ob = ass.GetType(fileName + ".App");
            if (ob.IsClass)
            {
                object obj = (object)Activator.CreateInstance(ob);
                FieldInfo[] fieldInfo = ob.GetFields();
                for (int i = 0; i < fieldInfo.Length; i++)
                {
                    if(fieldInfo[i].Name == "FormName")
                    {
                        returnstr = fieldInfo[i].GetValue(obj).ToString();
                        break;
                    }
                }
            }
            return returnstr;
        }

        #endregion

        #region 通用辅助方法

        /// <summary>
        /// 加载画面文件,把XML文件加载为XmlDocument对象
        /// </summary>
        /// <param name="fileName">画面文件名</param>
        /// <returns>返回加载后的XmlDocument对象</returns>
        private static XmlDocument ReadXmlFile(string fileName)
        {
            try
            {
                StreamReader sr = new StreamReader(fileName);
                string cleandown = sr.ReadToEnd();
                sr.Close();
                cleandown = "<DOCUMENT_ELEMENT>" + cleandown + "</DOCUMENT_ELEMENT>";
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(cleandown);
                return doc;
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                throw ex;
            }
        }

        /// <summary>
        /// 获取XML文档那个节点字符串属性值
        /// </summary>
        /// <param name="node">XML文档节点对象</param>
        /// <param name="attributeName">属性名称</param>
        /// <param name="defaultValue">如果获取失败,返回此默认值</param>
        /// <returns>返回对应的节点值</returns>
        public static string GetAttributeStringValue(XmlNode node, string attributeName, string defaultValue)
        {
            if (node.Attributes[attributeName] != null)
            {
                return node.Attributes[attributeName].Value;
            }
            else
            {
                return defaultValue;
            }
        }
        /// <summary>
        /// 获取XML文档那个节点整型属性值
        /// </summary>
        /// <param name="node">XML文档节点对象</param>
        /// <param name="attributeName">属性名称</param>
        /// <param name="defaultValue">如果获取失败,返回此默认值</param>
        /// <returns>返回对应的节点值</returns>
        public static int GetAttributeIntValue(XmlNode node, string attributeName, int defaultValue)
        {
            if (node.Attributes[attributeName] != null)
            {
                int.TryParse(node.Attributes[attributeName].Value, out defaultValue);
            }
            return defaultValue;
        }
        /// <summary>
        /// 获取XML文档那个节点布尔属性值
        /// </summary>
        /// <param name="node">XML文档节点对象</param>
        /// <param name="attributeName">属性名称</param>
        /// <param name="defaultValue">如果获取失败,返回此默认值</param>
        /// <returns>返回对应的节点值</returns>
        public static bool GetAttributeBoolValue(XmlNode node, string attributeName, bool defaultValue)
        {
            if (node.Attributes[attributeName] != null)
            {
                bool.TryParse(node.Attributes[attributeName].Value, out defaultValue);
            }
            return defaultValue;
        }

        #endregion
    }
    #endregion

    #region XML操作中用到的实体类定义

    #region 工程向导实体类,对应工程向导配置文件中的一条配置项
    /// <summary>
    /// 工程向导实体类,对应工程向导配置文件中的一条配置项
    /// </summary>
    [Serializable]
    public class ProjectWizard
    {
        /// <summary>
        /// 工程向导中文名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 工程向导英文名称
        /// </summary>
        public string EnglishName { get; set; }
        /// <summary>
        /// 工程向导英文名称缩写
        /// </summary>
        public string EnglishShortName { get; set; }
        /// <summary>
        /// 工程向导对应的图标索引
        /// </summary>
        public int ImageIndex { get; set; }
        /// <summary>
        /// 中文描述信息
        /// </summary>
        public string Description { get; set; }
        /// <summary>
        /// 英文描述信息
        /// </summary>
        public string EnglishDescription { get; set; }
    }

    #endregion

    #region 画面文件中的对象描述器实体类,对应Form.xml中的Object元素
    /// <summary>
    /// 画面文件中的对象描述器实体类,对应Form.xml中的Object元素
    /// </summary>
    [Serializable]
    public class ObjectDescriptor
    {
        private string parentName;
        private string name;
        private List<string> properties = new List<string>();

        public ObjectDescriptor()
        {

        }

        /// <summary>
        /// 父级对象名称
        /// </summary>
        public string ParentName
        {
            get { return parentName; }
            set { parentName = value; }
        }
        /// <summary>
        /// 对象名称
        /// </summary>
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        /// <summary>
        /// 对象属性名称列表
        /// </summary>
        public List<string> Properties
        {
            get { return properties; }
            set { properties = value; }
        }
    }
    #endregion

    #region 画面对应的菜单项实体
    /// <summary>
    /// 画面对应的菜单项实体
    /// </summary>
    [Serializable]
    public class RunConfigMenuItem
    {
        #region 字段定义

        private string _ID = String.Empty;
        private string _msgId = String.Empty;
        private string _text = String.Empty;
        private string _formFile = String.Empty;
        private string _formText = String.Empty;
        private string _icon = String.Empty;
        private Image _img = null;
        private int _index = 0;
        private string _shortCut = String.Empty;
        private FormShowType _showType = FormShowType.Document;
        private CreateType _createType = CreateType.Form;
        private bool _isSystem = false;
        private bool _isAutoLoad = false;
        private RunConfigMenuItem _parent = null;
        private List<string> _commandValue = null;

        #endregion

        /// <summary>
        /// 标识
        /// </summary>
        public string ID
        {
            get { return this._ID; }
            set { this._ID = value; }
        }
        /// <summary>
        /// 国际化资源ID
        /// </summary>
        public string MsgId
        {
            get { return _msgId; }
            set { _msgId = value; }
        }
        /// <summary>
        /// 显示文本
        /// </summary>
        public string Text
        {
            get { return this._text; }
            set { this._text = value; }
        }
        /// <summary>
        /// 画面文件名
        /// </summary>
        public string FormFile
        {
            get { return this._formFile; }
            set { this._formFile = value; }
        }
        /// <summary>
        /// 原始画面窗体Text属性
        /// </summary>
        public string FormText
        {
            get { return this._formText; }
            set { this._formText = value; }
        }
        /// <summary>
        /// 图标文件路径
        /// </summary>
        public string ICON 
        {
            get { return this._icon; }
            set { this._icon = value; }
        }
        /// <summary>
        /// 图标对象
        /// </summary>
        public Image Img
        {
            get { return this._img; }
            set { this._img = value; }
        }
        /// <summary>
        /// 索引位置
        /// </summary>
        public int Index
        {
            get { return this._index; }
            set { this._index = value; }
        }
        /// <summary>
        /// 快捷键文本
        /// </summary>
        public string ShortCut
        {
            get { return this._shortCut; }
            set { this._shortCut = value; }
        }
        /// <summary>
        /// 是否已对话框显示
        /// </summary>
        public FormShowType ShowType
        {
            get { return this._showType; }
            set { this._showType = value; }
        }
        /// <summary>
        /// 菜单的创建类型
        /// </summary>
        public CreateType CreateType
        {
            get { return this._createType; }
            set { this._createType = value; }
        }
        /// <summary>
        /// 是否为系统菜单
        /// </summary>
        public bool IsSystem
        {
            get { return this._isSystem; }
            set { this._isSystem = value; }
        }
        /// <summary>
        /// 是否自动加载
        /// </summary>
        public bool IsAutoLoad
        {
            get { return this._isAutoLoad; }
            set { this._isAutoLoad = value; }
        }
        /// <summary>
        /// 父级菜单对象
        /// </summary>
        public RunConfigMenuItem Parent
        {
            get { return this._parent; }
            set { this._parent = value; }
        }

        public List<string> CommandValue
        {
            get { return this._commandValue; }
            set { this._commandValue = value; }
        }

        public override string ToString()
        {
            if (this._createType == CreateType.Form)
            {
                if (String.IsNullOrEmpty(this.FormFile))
                {
                    return String.Format("{0}", this._text);
                }
                else if (this._ID.Contains("dll_"))
                {
                    return String.Format("{0}({1}.dll)", this._text, this.FormFile);
                }
                else
                {
                    return String.Format("{0}({1}.xml)", this._text, this.FormFile);
                }
            }
            else if (this._createType == CreateType.Command)
            {
                return String.Format("{0}", this._text);
            }
            else
            {
                return String.Empty;
            }
        }
    }

    /// <summary>
    /// 菜单命令调用窗体时,窗体的显示方式
    /// </summary>
    [Serializable]
    public enum FormShowType
    {
        /// <summary>
        /// 文档方式,放入DockPanel
        /// </summary>
        Document = 1,
        /// <summary>
        /// 独立窗体方式
        /// </summary>
        Form = 2,
        /// <summary>
        /// 对话框方式
        /// </summary>
        Dialog = 3,
        /// <summary>
        /// 多屏方式
        /// </summary>
        MultiScreen = 4,
        /// <summary>
        /// 浮动
        /// </summary>
        FloatWindow = 5
    }
    #endregion

    #endregion


    /// <summary>
    /// Xml辅助类
    /// </summary>
    public static class XmlHelper
    {
        /// <summary>
        /// 扩展方法-判断2个节点的Name属性值是否相等
        /// </summary>
        /// <param name="node1">当前节点</param>
        /// <param name="node2">要比较的节点</param>
        /// <returns>相等返回true,否则返回false</returns>
        public static bool NodeEquals(this XmlNode node1, XmlNode node2)
        {
            if (node1.Attributes["Name"] != null && node2.Attributes["Name"] != null)
            {
                return node1.Attributes["Name"].Value.Equals(node2.Attributes["Name"].Value);
            }
            return node1.Equals(node2);
        }

        /// <summary>
        /// 节点集合中是否包含此节点
        /// </summary>
        /// <param name="nodeList"></param>
        /// <param name="node"></param>
        /// <returns></returns>
        public static bool ContainsNode(this List<XmlNode> nodeList, XmlNode node)
        {
            foreach (XmlNode n in nodeList)
            {
                if (n.NodeEquals(node))
                {
                    return true;
                }
            }
            return false;
        }
        /// <summary>
        /// 扩展方法-从节点集合中删除一个节点
        /// </summary>
        /// <param name="nodeList">当前节点集合</param>
        /// <param name="node">要移除的节点</param>
        public static void Remove(this List<XmlNode> nodeList, XmlNode node)
        {
            foreach (XmlNode n in nodeList)
            {
                if (n.NodeEquals(node))
                {
                    nodeList.Remove(n);
                    break;
                }
            }
        }

        /// <summary>
        /// 集合转换
        /// </summary>
        /// <param name="nodeList">要转换的XmlNodeList对象</param>
        /// <returns>变为XmlNode集合</returns>
        public static List<XmlNode> ConvertListFromNodeList(XmlNodeList nodeList)
        {
            List<XmlNode> lst = new List<XmlNode>();
            foreach (XmlNode node in nodeList)
            {
                lst.Add(node);
            }
            return lst;
        }
        /// <summary>
        /// 求2个集合的交集
        /// </summary>
        /// <param name="list1"></param>
        /// <param name="list2"></param>
        /// <returns></returns>
        public static List<XmlNode> IntersectNode(this List<XmlNode> list1, List<XmlNode> list2)
        {
            List<XmlNode> list = new List<XmlNode>();
            foreach (XmlNode node in list1)
            {
                if (list2.ContainsNode(node))
                {
                    list.Add(node);
                }
            }
            return list;
        }
        /// <summary>
        /// 获取一组控件的属性值
        /// </summary>
        /// <param name="comps"></param>
        /// <param name="propertyName"></param>
        /// <returns></returns>
        public static object GetPropertyValue(object[] comps, string propertyName)
        {
            object value = String.Empty;
            bool beginFlag = true;
            foreach (object obj in comps)
            {
                System.Reflection.PropertyInfo propertyInfo = obj.GetType().GetProperty(propertyName);
                if (propertyInfo == null)
                {
                    return String.Empty;
                }
                if (beginFlag)
                {
                    value = propertyInfo.GetValue(obj, null);
                    beginFlag = false;
                }
                else
                {
                    if (value == propertyInfo.GetValue(obj, null))
                    {
                        continue;
                    }
                    else
                    {
                        return String.Empty;
                    }
                }
            }
            return value;
        }

        /// <summary>
        /// 为一组控件的属性赋值
        /// </summary>
        /// <param name="comps"></param>
        /// <param name="propertyName"></param>
        /// <param name="value"></param>
        public static void SetPropertyValue(object[] comps, string propertyName, object value)
        {
            foreach (object obj in comps)
            {
                System.Reflection.PropertyInfo propertyInfo = obj.GetType().GetProperty(propertyName);
                if (propertyInfo == null)
                {
                    continue;
                }
                propertyInfo.SetValue(obj, value, null);
            }
        }
    }
}