1.需求
获取Form窗体中表控件及其属性。
2.需求分析
接到这个需求,首先考虑使用“反射”实现。但这里主程序(解析程序)为外部程序,被解析对象为项目代码,尝试采用过“动态加载类文件”+“反射”的形式实现,
但遇到了更加棘手的问题,以致功能交期愈加遥遥无期。遂采用“正则表达解析代码”,简单粗暴,以下为关键的正则表达式与大家分享解决思路。
3.解决方案
3.1.获取窗体名
(?<=this.Name = )\S*(?=;)
3.2.匹配DBGrid名字
(?<=private WBF\.Controls\.DBGrid\s+)\w*
“private WBF.Controls.DBGrid”开头,空格若干,最近的一个单词字符
3.3.匹配DBGrid所有属性
(this\.dbGrid1\.\w+[^;]*)(?=\;)
满足“this.dbGrid1.”开头,紧接至少一个单词,其后除“;”任意字符若干,并且末尾是分号 的范围字符
3.4.取GridColumn名
(?<=private DevExpress\.XtraGrid\.Columns\.GridColumn\s+)\w*
3.5.获取GridColumn属性值
(this\.{0}\.\w+[^;]*)
附件
正则表达式封装类
public class RegexHelper
{
/// <summary>
/// 匹配返回List<string>
/// </summary>
/// <param name="a_strPattern">正则表达式</param>
/// <param name="a_txtContext">匹配文本</param>
/// <returns></returns>
public List<string> RegexForList(string a_strPattern,string a_txtContext)
{
List<string> l_listString = new List<string>();
l_listString.Clear();
Regex l_regResult = new Regex(a_strPattern,RegexOptions.IgnoreCase);
MatchCollection matches = l_regResult.Matches(a_txtContext);
foreach(Match item in matches)
{
l_listString.Add(item.Value);
}
return l_listString;
}
/// <summary>
/// 匹配返回Dictionary<string,string>
/// </summary>
/// <param name="a_strPattern">正则表达式</param>
/// <param name="a_txtContext">匹配文本</param>
/// <returns></returns>
public Dictionary<string,string> RegexForDictionary(string a_strPattern,string a_txtContext)
{
Dictionary<string,string> l_dicResult = new Dictionary<string,string>();
l_dicResult.Clear();
Regex reg_Power = new Regex(@a_strPattern,RegexOptions.IgnoreCase);
MatchCollection matches = reg_Power.Matches(a_txtContext);
foreach(Match item in matches)
{
if(l_dicResult.ContainsKey(item.Value)==false)
{
l_dicResult.Add(item.Value,item.Value);
}
}
return l_dicResult;
}
/// <summary>
/// 匹配返回bool
/// </summary>
/// <param name="a_strPattern">正则表达式</param>
/// <param name="a_txtContext">匹配文本</param>
/// <returns></returns>
public bool RegexForBool(string a_strPattern,string a_txtContext)
{
Regex reg = new Regex(@a_strPattern,RegexOptions.IgnoreCase);
Match match = reg.Match(a_txtContext);
return match.Success;
}
/// <summary>
/// 匹配返回string
/// </summary>
/// <param name="a_strPattern">正则表达式</param>
/// <param name="a_txtContext">匹配文本</param>
/// <returns></returns>
public string RegexForString(string a_strPattern,string a_txtContext)
{
Regex l_reg = new Regex(@a_strPattern,RegexOptions.IgnoreCase);
MatchCollection matches_Type = l_reg.Matches(a_txtContext);
foreach(Match item in matches_Type)
{
return item.Value;
}
return "";
}
}