一起谈.NET技术,用lambda去除Magic-String
2011-08-29 19:30 狼人:-) 阅读(266) 评论(0) 编辑 收藏 举报string是我们的朋友。我们离不开string,但是有时候string也挺烦人的。
比如说,下面的代码,根据方法名来获取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
注意:个人意见,仅供参考!
声明:此博有部分内容为转载,版权归原作者所有~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南