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收藏起来。







