MVC Helper Extension问题

时间:2010-06-18 05:10:03

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

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

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

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

  

“条件属性无效,因为其返回类型不是无效。”

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

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

2 个答案:

答案 0 :(得分:6)

您可以使用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 :(得分:1)

我不知道原始设计师最初是否考虑过这种思路,但这对我来说是有道理的。

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

John的例子可行,但我会这样做:

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

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