一起谈.NET技术,用lambda去除Magic-String
2011-08-29 19:30
274 查看
string是我们的朋友。我们离不开string,但是有时候string也挺烦人的。
比如说,下面的代码,根据方法名来获取MethodInfo:
进行“Rename Method”重构时,重构工具是不会去对string进行重命名的。
我们不得不手动去一个一个改。如果漏了一个,我们也不能能当场知道,等到程序报错时就太晚了!
我们可以通过lambda表达式,来获取MethodInfo:
同样,我们可以获取PropertyInfo:
下面是实现代码:
更实用的例子是,MVC的RedirectToAction方法:
用同样的方法,上面的代码,可以重写为:
下面是实现代码:
参考:http://blog.andreloker.de/post/2008/06/Getting-rid-of-strings-%282%29-use-lambda-expressions.aspx
注意:个人意见,仅供参考!
比如说,下面的代码,根据方法名来获取MethodInfo:
var info = typeof (DateTime).GetMethod("ToShortDateSting"); Console.WriteLine(info.Name);
进行“Rename Method”重构时,重构工具是不会去对string进行重命名的。
我们不得不手动去一个一个改。如果漏了一个,我们也不能能当场知道,等到程序报错时就太晚了!
我们可以通过lambda表达式,来获取MethodInfo:
var info = Reflect.GetMethod<DateTime>(dt => dt.ToShortDateString()); Console.WriteLine(info.Name);
同样,我们可以获取PropertyInfo:
var dayProperty = Reflect.GetProperty<DateTime>(dt => dt.Day); Console.WriteLine(dayProperty.Name);
下面是实现代码:
public static class Reflect { public static MethodInfo GetMethod<TClass>(Expression<Action<TClass>> expression) { var methodCall = expression.Body as MethodCallExpression; if(methodCall == null) { throw new ArgumentException("Expected method call"); } return methodCall.Method; } public static PropertyInfo GetProperty<TClass>(Expression<Func<TClass, object>> expression) { MemberExpression memberExpression; var unary = expression.Body as UnaryExpression; if (unary != null) { memberExpression = unary.Operand as MemberExpression; } else { memberExpression = expression.Body as MemberExpression; } if (memberExpression == null || !(memberExpression.Member is PropertyInfo)) { throw new ArgumentException("Expected property expression"); } return (PropertyInfo) memberExpression.Member; } }
更实用的例子是,MVC的RedirectToAction方法:
public class HomeController : Controller { public void Index() { if(!UserIsLoggedIn) { RedirectToAction("Login" ); } } public void Login() { } }
用同样的方法,上面的代码,可以重写为:
public class HomeController : Controller { public void Index() { if(!UserIsLoggedIn) { this.RedirectToAction(c => c.Login()); } } public void Login() { } }
下面是实现代码:
public static class ControllerExtensions { public static void RedirectToAction<TController>(this TController controller, Expression<Action<TController>> expression) where TController : Controller { var methodCall = expression.Body as MethodCallExpression; if (methodCall == null) { throw new ArgumentException("Expected method call"); } controller.RedirectToAction(methodCall.Method.Name); } }
参考:http://blog.andreloker.de/post/2008/06/Getting-rid-of-strings-%282%29-use-lambda-expressions.aspx
注意:个人意见,仅供参考!
相关文章推荐
- 一起谈.NET技术,深入理解string和如何高效地使用string
- 一起谈.NET技术,【More Effective C#】Lambda表达式优化
- 一起谈.NET技术,通过16道练习学习Linq和Lambda
- 一起谈.NET技术,从.NET中委托写法的演变谈开去(中):Lambda表达式及其优势
- 一起谈.NET技术,Visual Studio LightSwitch初体验和定位看法
- 一起谈.NET技术,C# 4动态编程新特性与DLR剖析
- 一起谈.NET技术,Silverlight实例教程 - Out of Browser的Debug和Notifications窗口
- 一起谈.NET技术,VB.NET和C#的发展与动态语言运行时
- 一起谈.NET技术,利用.NET Framework4.0的源代码调试你的应用程序
- 一起谈.NET技术,WPF 动态模拟CPU 使用率曲线图
- 一起谈.NET技术,WPF 员工卡条形码
- 一起谈.NET技术,WPF 基础到企业应用系列5——WPF千年轮回2
- 一起谈.NET技术,.net其实也可以不拖控件的......
- 一起谈.NET技术,2010 .NET面试题整理之基础篇
- 一起谈.NET技术,解析对云计算的十大误解
- 一起谈.NET技术,Sharepoint 究竟能为客户做些什么
- 一起谈.NET技术,VS 2010 和 .NET 4.0 系列之《代码优化的Web开发Profile》篇
- 一起谈.NET技术,ASP.NET MVC中对Model进行分步验证的解决方法
- 一起谈.NET技术,SharePoint 2010 服务应用程序(Service Application)架构
- 一起谈.NET技术,HubbleDotNet 和 Lucene.Net 匹配相关度的比较