【问题标题】:Type safety in string arguments字符串参数中的类型安全
【发布时间】:2011-06-16 17:22:32
【问题描述】:

我的具体问题是关于 ASP.NET MVC,但我确信答案可以应用到 ASP.NET 之外。

如何处理接受字符串参数但仍需要类型安全的函数?

在 ASP.NET 中,扩展方法 Html.ActionLink 有两个字符串类型的参数:string linkText, string actionName。第一个参数是可以从资源加载的文本,而第二个参数是代码中存在的方法的名称。

一种选择是使用常量字符串创建一个类,而不是编写

 Html.ActionLink("Blah blah", "MyAction");

可以写:

Html.ActionLine("Blah blah", StrongType.MyAction);

其中MyAction 是一个名为StrongType 的类中的常量字符串。但是,当可以作为参数传递的方法和其他对象的数量增加时,这将变得难以管理。

第二种选择是使用反射以某种方式加载函数的名称,但这似乎太昂贵了。

有没有更好的方法?你如何确保你没有像前面提到的那样在字符串参数中出现拼写错误?

【问题讨论】:

    标签: c# strong-typing


    【解决方案1】:

    您可以使用 ActionLink 扩展方法,让您避免使用这些魔术字符串。

    <%= Html.ActionLink<BlahController>(c => c.MyAction(), "Blah blah");
    

    您需要引用 Microsoft.Web.Mvc,它是 ASP.NET MVC 3 Futures 的一部分,可在 http://aspnet.codeplex.com/releases/view/58781 获得。

    【讨论】:

    • ActionLink 的重载在哪里定义?我在 ASP.NET/MVC 3 中看不到它。
    • @Lester,什么版本?它在什么类中定义?它不存在于 ASP.NET/MVC 3 的发布版本中。
    • @Kirk Woll:你确定你在看的是 Microsoft.Web.Mvc 而不是 System.Web.Mvc?我刚刚仔细检查过,它存在于aspnet.codeplex.com/releases/view/58781的 ASP.NET MVC 3 Futures 程序集中@
    • 啊,谢谢! IMO,这是一个至关重要的信息,应该提到您的建议是非标准的,并且如果没有单独的下载则无法使用。但是+1。
    • 其实我也学到了一些新东西。我没有意识到它在 Futures 程序集中,因为我一直在使用已经包含它的 S#arp 架构框架。
    【解决方案2】:

    我认为 Lester 的回答适合这种特定情况。但在更一般的情况下,您确实需要定义常量并使用它们。是的,这很痛苦,但是您可以设置很多 很多 常量,这样您就不必在您的意思是“黄色”的情况下,不必追踪由于给出“黄色”参数而导致的错误。

    现在,如果您是设计被调用方法的人,当您确实有一组可以接受的常量值时,不要将其作为字符串参数。将其设为枚举。

    【讨论】:

    • 我不同意。它认为有更好的方法来解决这个问题,然后引入这种大量维护开销。
    • @Kirk Woll:我想看看这些“更好的方法”
    • @Neil,像 Lester 描述的那样的扩展方法肯定更好。使用 ReSharper 静态检测这些错误肯定更好。等等
    • @Kirk Woll:除非我们想象的是完全不同的情况,否则我真的不明白开销为何如此巨大。您需要定义一个辅助类和一些常量。 (如果所有内容都在同一个类中,您甚至可以跳过辅助类。)一旦您这样做了,编译器就会成为您的好朋友并帮助您避免严重错误。就像我在回答中所说的那样,仅仅避免一个会话试图追踪一个错误输入的字符串可能会付出很多倍的努力来设置常量
    • 每次添加新动作时,都必须在存储常量的任何位置添加新条目。这是一个非常痛苦的工作流程。这就像每次向类添加属性时都向枚举添加一个值。那真的会让我的风帆失去动力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2021-10-21
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多