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

本文关键字:方法 有问题 扩展 调用 ViewPage | 更新日期: 2023-09-27 17:50:10

我为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" %>
我可以通过this调用Test()方法:
<% this.Test(); %>

但是当我试图调用它而不引用时,这个:

<% Test(); %>

我得到一个编译错误:

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

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

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

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

这不仅仅是ASP的限制。这是c#中扩展方法的一般规则:

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

将无法编译,因为c#编译器要求使用实例调用扩展方法。为什么这个决定是这样的,可能是因为一些只有Eric Lippert才能想到的角落案例:)