WEB开发网
开发学院软件开发C语言 c#扩展方法奇思妙用高级篇五:ToString(string fo... 阅读

c#扩展方法奇思妙用高级篇五:ToString(string format) 扩展

 2010-09-30 20:52:19 来源:WEB开发网   
核心提示: 3~5行通过反射获取了公有的、实例的Get属性(如果需要静态的或私有的,修改第5行中即可),c#扩展方法奇思妙用高级篇五:ToString(string format) 扩展(3),7~8行动态生成一个正则表达式来匹配format,10~16行是匹配成功后的处理,我权衡了一下,最后决定采用类似S

3~5行通过反射获取了公有的、实例的Get属性(如果需要静态的或私有的,修改第5行中即可),7~8行动态生成一个正则表达式来匹配format,10~16行是匹配成功后的处理。这里用到反射和正则表达式,如果不熟悉不要紧,先调试运行吧,测试一下前面刚提到的应用:

c#扩展方法奇思妙用高级篇五:ToString(string format) 扩展

第一个和我们理想的有点差距,就是日期上,我们应该给日期加上"yyyy-MM-dd"的格式,这个我们稍后改进,我们现在有一个更大的问题:

如果我们想输出:“People: Id 1, Name 鹤冲天”,format怎么写呢?写成format="People: Id Id, Name Name",这样没法处理了,format中两个Id、两个Name,哪个是常量,哪个是变量啊?解决这个问题,很多种方法,如使用转义字符,可是属性长了不好写,如format="\B\r\i\t\h\d\a\y Brithday"。我权衡了一下,最后决定采用类似Sql中对字段名的处理方法,在这里就是给变量加上中括号,如下:

1     People p2 = new People { Id = 1, Name = "鹤冲天", Brithday = new DateTime(1990, 9, 9) };
2     string s2 = p1.ToString2("People:Id [Id], Name [Name], Brithday [Brithday]");

版本二的实现代码如下:

 1    public static string ToString2(this object obj, string format)
 2    {
 3        Type type = obj.GetType();
 4        PropertyInfo[] properties = type.GetProperties(
 5            BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance);
 6 
 7        MatchEvaluator evaluator = match =>
 8        {
 9            string propertyName = match.Groups["Name"].Value;
10            PropertyInfo property = properties.FirstOrDefault(p => p.Name == propertyName);
11            if (property != null)
12            {
13                object propertyValue = property.GetValue(obj, null);
14                if (propertyValue != null) return propertyValue.ToString();
15                else return "";
16            }
17            else return match.Value;
18        };
19        return Regex.Replace(format, @"\[(?<Name>[^\]]+)\]", evaluator, RegexOptions.Compiled);
20    }

上一页  1 2 3 4 5 6 7  下一页

Tags:扩展 方法 奇思

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接