nameof是C# 6才引进的功能,改善之前一些字串弱维护方式,改成编译前强检查,在重构/重命名的名称时非常有用。
举例(zflwx):
常看到ASP.NET MVC工程师在新项目使用HTML Helper,还是延续弱维护字串方式来串接Link,Url…以下一个跳转Link例子
public class HomeController:Controller
{
public ActionResult Index()=> this.View();
}
public class ITHelpController:Controller
{
public ActionResult SayHello()=> this.Content(“Hello ITHelp”);
}
@Html.ActionLink(“SayHello”,“SayHello”,“Home”)
项目小还好,当项目随着时间变大变复杂,这时候有人修改、停用Controller、Action名称,就需要使用人工判断方式找寻、修改。
这时候可以改成nameof,以下gif内容展示方便更改方法等名称,不用担心改A坏B
@Html.ActionLink(linkText:“SayHello”,
actionName: nameof(ITHelpController.SayHello),
controllerName: nameof(ITHelpController).GetControllerName()
)
2019-01-15.13.34.45-20190107.gif
至于GetControllerName()是另外封装的工具方法,为何额外做一个Extension,有经验的前辈、读者一定会想到,HTML Helper对Controller Name定义是不需要包含Controller,直接使用nameof(HomeController)会找不到资源404错误,举例:
2019-01-15.13.13.04-image.png
所以写一个MVCStringExtension
public static class MVCStringExtension
{
public static string GetControllerName(this string controllerName)
{
if(!controllerName.EndsWith(“Controller”))
throw new Exception(“请使用Controller类别”);
return controllerName.Replace(“Controller”,“”);
}
}
当然nameof不只能应用在HTML Helper,像是Dapper一样可以藉由nameof维护字串字段,避免忘记更新名称情况
void Main(ldmzl)
{
using(var cn = SqlHelper.GetConnection())
{
cn.Query<Test>($“select {nameof(Test.Name)} from {nameof(Test)};”);
}
}
public class Test{
public string Name { get;set;}
}
最后nameof更好的一点是不会影响性能,藉由反编译查看,可以发现系统自动转成对应字串.