【问题标题】:MVC Helper Extension issueMVC 助手扩展问题
【发布时间】:2010-06-18 05:10:02
【问题描述】:

我需要在我的 MVC 项目中实现 HtmlHelper 扩展,只是为了输出一些字符串,但只能在调试模式下,而不是在发布模式下。 我的第一次尝试是:

[Conditional("DEBUG")]
public static string TestStringForDebugOnly(this HtmlHelper helper, string testString)
{
    return testString;
}

但显然这会产生编译错误:

“Conditional 属性无效,因为它的返回类型不是 void。”

所以我的理解是一旦你设置了[Conditional] 属性,它就不允许返回任何东西?为什么?

还有其他方法可以实现这种功能吗?任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net asp.net-mvc c-preprocessor


    【解决方案1】:

    您可以使用preprocessor directive

    public static string TestStringForDebugOnly(this HtmlHelper helper, string testString)
    {
    #if DEBUG
        return "debug";
    #else
        return "other";
    #endif
    }
    

    至于你原来的问题,看看section 17.4.2 of the C# specification 表明:

    [A] 条件方法的返回类型必须为void

    我只能推测语言的设计者为什么决定这样做,但我冒昧地猜测这是因为如果条件是false,C# 编译器不会将方法调用编译成 IL,所以实际上它是如果您从未调用过该方法(如果需要返回值,这将在运行时导致一些明显的问题!)

    【讨论】:

    • +1 了解您如何解读语言设计者的想法。我从来不明白人们是怎么想的。也许如果我变老变聪明...
    • @Malcolm:语言设计者的思想并不是他唯一阅读的东西......
    • @Neil - 我对你的最后评论感到困惑
    【解决方案2】:

    我不知道最初的设计师最初是否有这样的想法,但这对我来说是有意义的。

    因为您只能将方法声明为 void 类型并且它不能被覆盖并且它不能作为接口的一部分被引用,所以编译器可以简单地忽略该方法,因为如果指定的模式不匹配,它将没有依赖关系.如果另一个方法以非匹配模式调用它,编译器可以简单地将其视为无效的方法调用,就好像该属性不存在一样。

    约翰的例子可以,但我会做这样的事情:

    #if DEBUG
    public static string TestStringForDebugOnly(...)
    {
        ...
    }
    #endif
    
    // Arguments are only for illustration.
    public string CallingMethod(int id, string temp)
    {
    
        #if DEBUG
        string result = TestStringForDebugOnly(id, temp);
        #else
        string result = TestString(id, temp);
        #endif
    
        return result;
    }
    

    出于两个原因,我会花费额外的精力将所有与调试相关的代码(包括单独的方法调用)包含在预处理器指令中。首先,它提供了自己的内置文档;您确切地知道应该在何时、何地以及为什么运行。其次,如果需要修改或删除代码,则需要进行的搜索量大大减少,并且需要反复编译和重新编译以查看哪些中断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多