在ViewPage上调用扩展方法的问题

时间:2011-04-15 00:19:25

标签: c# asp.net-mvc-2 extension-methods viewpage

我为ViewPage创建了以下扩展方法:

using System.Web.Mvc;

namespace G3Site {
    public static class ViewPage_Extensions {
        public static void Test(this ViewPage vp) {
            vp.Writer.Write("this is a test");
        }
    }
}

然后我在我的aspx页面上放了一个import语句

<%@ Import Namespace="G3Site" %>

我可以通过这个调用Test()方法就好了:

<% this.Test(); %>

但是当我尝试在不参考这个

的情况下调用它
<% Test(); %>

我收到编译错误:

CS0103: The name 'Test' does not exist in the current context

有没有人知道为什么会发生这种情况并且有办法吗?

2 个答案:

答案 0 :(得分:0)

C#编译器要求根据C#语言规范(第7.6.5.2节)将扩展方法称为表达式(例如变量或对象引用)的“off”。

答案 1 :(得分:0)

这不仅仅是对ASP.Net MVC视图的限制,这是C#中扩展方法的一般规则:

public class SomeClass
{
    public void Method()
    {
        ExtensionMethod();
    }
}

public static class Extensions
{
    public static void ExtensionMethod(this SomeClass sc) { }
}

这不会编译,因为C#编译器需要使用实例调用扩展方法。为什么这个决定是这样的,可能是因为只有Eric Lippert才能想到的一些极端情况:)