首页 | 软件中心 | Designand Inspiration
读库教程网 > 网络教程 > 技术开发 > C-C++ > 用lambda去除Magic-String

用lambda去除Magic-String

添加:2010年7月23日



  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);
  }
}

读库教程网文章由网络收集后整理发布,文章发布人拥有该内容的所有权力及责任!

如果你喜欢这页,可以按Ctrl+D收藏起来。

相关内容
上一个内容:RichTextBox扩充控件的中文乱码处置打算
下一个内容:Has no
相关评论
公益广告
精彩推荐
友情链接: 百分百青年 | 烛光信息网 | 夏布新网 | 新育互联网
管理员:QQ:27038219, E-mail:27038219@qq.com今日更新
读库教程网所有文章从网络收集所发布,文章发布人拥有该内容的所有权力及责任,转载时请注明出处!
Template designed by www.dkuu.com. Optimized for 1024x768 to Firefox,Opera and MS-IE6/IE7.