博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
repeater 模拟器 in winform
阅读量:5231 次
发布时间:2019-06-14

本文共 2314 字,大约阅读时间需要 7 分钟。

需求

有一个这样的需求,根据给定的数据源和html模板生成html,强大的All in one code中的代码不能满足需求,所以就有了RepeaterSimulate.

其中涉及:反射、泛型、正则表达式等基础知识。

 

RepeaterSimulate使用

 
 
RepeaterSimulate r = new RepeaterSimulate();
r.ItemTemplate = "
#Name#
#Age#
";
List
tm = new List
() {
new TestModel(){Name="zhangsan",Age=11},
new TestModel(){Name="lisi",Age=12},
new TestModel(){Name="wangwu",Age=13},
new TestModel(){Name="sunliu",Age=31}
};
string html = r.GenerateHTML
(tm);
Console.WriteLine(html);
Console.Read();

效果如图:

 

RepeaterSimulate实现

模拟器中的GenerateHTML方法:

 
public string GenerateHTML
(object obj)
{
StringBuilder sb = new StringBuilder();
IEnumerable
enumerable = obj as IEnumerable
;
 
MemberInfo[] myMemberInfo;
 
// Get the type of 'MyClass'.
Type myType = typeof(T);
 
// Get the information related to all public member's of 'MyClass'.
myMemberInfo = myType.GetMembers();
 
string regexText = "#\\w{1,}#";
Match mt = Regex.Match(this.ItemTemplate, regexText);
List
results = RegularHelper.GetResult(mt);
foreach (var item in enumerable)
{
string tempStr = this.ItemTemplate;
for (int i = 0; i < myMemberInfo.Length; i++)
{
 
if (myMemberInfo[i].MemberType.ToString() == "Property")
{
if (results.Contains(myMemberInfo[i].Name))
{
 
object v = myType.InvokeMember(myMemberInfo[i].Name,
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.GetProperty, null, item, null);
tempStr = tempStr.Replace("#" + myMemberInfo[i].Name + "#", v.ToString());
}
}
 
}
sb.Append(tempStr);
}
 
return sb.ToString();
}

其中的#\\w{1,}#匹配对象为”#中间为字符,字符数量大于1个#”,这里约定好被绑定的数据源的属性名在两个#之间,当然也可以类似aspx<%#神马的 %>

遍历正则匹配到的属性:

 
public class RegularHelper
{
private static List
Result {
get;set;}
public static List
GetResult(Match mt)
{
List
r = new List
();
GetMatchValues(mt,r);
return r;
}
private static void GetMatchValues(Match mt, List
r)
{
r.Add(mt.Value.TrimStart('#').TrimEnd('#'));
if (mt.NextMatch().Length > 0)
GetMatchValues(mt.NextMatch(),r);
}
}

上面的GetMatchValues递归遍历出所有匹配的对象。

 

思考题

支持这种写法#Name.substring(0,12)+”……”#

下载试用

转载于:https://www.cnblogs.com/iamzhanglei/archive/2012/02/08/2342903.html

你可能感兴趣的文章
Java内部类详解
查看>>
python-基础
查看>>
17 案例
查看>>
【BZOJ 1221】 [HNOI2001] 软件开发
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
SQL字符型转日期型
查看>>
Java程序设计教程(第2版)阅读总结
查看>>
图论-次短路求法
查看>>
ios下opencv编译merge函数报错问题
查看>>
What's New for Visual C# 6.0
查看>>
ExtJs学习笔记之ComboBox组件
查看>>
关于收费软件
查看>>
getopt_long
查看>>
HTML5中File
查看>>
TensorFlow MNIST CNN 代码
查看>>
javascript之Style物
查看>>
兼容所有浏览器的实时监听输入的解决方案(转)
查看>>
JSON跨域解决方案收集
查看>>
【转】linux dumpe2fs命令
查看>>
SSH框架整合总结
查看>>