0

我为 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 Namespace="G3Site" %>

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

<% this.Test(); %>

但是当我尝试在不参考这个的情况下调用它时:

<% Test(); %>

我得到一个编译器错误:

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

有谁知道为什么会发生这种情况,有没有办法解决?

4

2 回答 2

0

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

于 2011-04-15T00:29:57.650 回答
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 才能想到的极端案例:)

于 2011-04-15T00:33:28.567 回答