用lambda去除Magic-String

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

注意:个人意见,仅供参考!

时间: 2024-08-28 16:32:14

用lambda去除Magic-String的相关文章

一起谈.NET技术,用lambda去除Magic-String

string是我们的朋友.我们离不开string,但是有时候string也挺烦人的. 比如说,下面的代码,根据方法名来获取MethodInfo: var info = typeof (DateTime).GetMethod("ToShortDateSting");Console.WriteLine(info.Name); 进行"Rename Method"重构时,重构工具是不会去对string进行重命名的. 我们不得不手动去一个一个改.如果漏了一个,我们也不能能当场

Javascript 修改String 对象 增加去除空格功能(示例代码)_javascript技巧

复制代码 代码如下: //#region 去除空格String.prototype.Trim = function () {    return this.replace(/(^\s*)|(\s*$)/g, "");} String.prototype.LTrim = function () {    return this.replace(/(^\s*)/g, "");} String.prototype.RTrim = function () {    retu

Java基础之009-浅尝Java的String类

Java基础之009-浅尝Java的String类                                        老帅 一.String类   1. 获取:        1.1 获取字符串中字符的个数(长度).                            int length();        1.2 根据位置获取字符.                            char charAt(int index);        1.3 根据字符获取在字符串中

Java Lambda 表达式详解及示例代码_java

Java Lambda 表达式是 Java 8 引入的一个新的功能,可以说是模拟函数式编程的一个语法糖,类似于 Javascript 中的闭包,但又有些不同,主要目的是提供一个函数化的语法来简化我们的编码. Lambda 基本语法 Lambda 的基本结构为 (arguments) -> body,有如下几种情况: 参数类型可推导时,不需要指定类型,如 (a) -> System.out.println(a) 当只有一个参数且类型可推导时,不强制写 (), 如 a -> System.o

C#委托基础8——lambda表达式

  C#委托基础系列原于2011年2月份发表在我的新浪博客中,现在将其般至本博客. class Program { double AddInt(int x, int y) { return x + y; } string AddString(string s1, string s2) { return s1 + s2; } static void Main(string[] args) { Program p = new Program(); // 以为前两个参数为int,他们运行的结果为dou

Jstl的函数库

js|函数 使用实例:<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> ${fn:length(myCollection)} 其他函数: 函数 描述 fn:contains(string, substring) 如果参数string中包含参数substring,返回true fn:containsIgnoreCase(string, substring) 如果参数

php字符串函数学习之substr()

 这篇文章主要介绍了php字符串函数学习之substr(),本文讲解了它的定义和用法.参数描述.提示和注释以及多个使用示例 ,需要的朋友可以参考下     <?php /* 定义和用法 substr() 函数返回提取的子字符串, 或者在失败时返回 FALSE. 语法 substr(string,start,length) 参数 描述 string 必需.规定要返回其中一部分的字符串. start 必需.规定在字符串的何处开始. 非负数 - 从 string 的 start 位置开始,从 0 开始

js获取指定的cookie的具体实现

 使用js获取cookie或许你会,但是要获取指定cookie,你会吗?下面有个不错的示例,大家可以参考下  代码如下: var cookieName = "cookie名字";  var cookieValue = null;//返回cookie的value值  if (document.cookie && document.cookie != '') {  var cookies = document.cookie.split(';');//将获得的所有cookie

如何在win 2003中得到登陆密码

  在所有NT系统中,都是有几种方法可以得到登陆用户的密码的.我知道的三种方法可以达到目的. 1.hook了winlogon中几个函数,网上也有这类型的程序,叫winlogonhijack的项目在rootkit.com中有提供,不过那个项目只对本地登陆用户有效,远程登陆用户无效. 2.使用Gina和winlogon进行套接,只要对某些函数执行自己的记录密码的代码,就可以将密码记录下来,稳定性高,而且对本地或远程登陆都有效,不过现存的gina后门程序在XP或2003中都有些函数没有被导出过,主要因