将 exportPDF 函数从页面移动到助手 class,替换 'this'。在 ASP.NET C# 中

Moving exportPDF function from page to a helper class, replacing 'this'. in ASP.NET C#

我有一个 ASP.NET Web 应用程序,我在其中创建了一个名为 Code 的文件夹。在这个文件夹中是我的 Basepage.cs。我还添加了一个名为 Reporting.cs 的 class,它将具有一个名为 ExportReport 的静态函数。当我将工作功能从 asp.net 页面移动到 Reporting.cs class 时,关键字 'this.' 出错了:

    this.Response.Clear();
    this.Response.ContentType = result.MimeType;
    this.Response.Cache.SetCacheability(HttpCacheability.Private);
    this.Response.Expires = -1;
    this.Response.Buffer = true;

    this.Response.BinaryWrite(result.DocumentBytes);
    this.Response.End();

在 'this' 引用当前页面 class 之前,我属于类型 (System.Web.Page)。现在我没有了,那么我将如何使用响应方法?

在我看来你是在描述想要使用 extension method

该方法的签名最终应如下所示(我不知道您希望该方法具有什么 return 类型,所以我选择 void 只是为了拥有一些东西):

static public class Reporting
{
    . . .
    static public void ExportReport(this BasePage page)
    {
        . . .
    }
}

ExportReport 的正文将使用 this 替换 page

page.Response.Clear();
page.Response.ContentType = result.MimeType;
page.Response.Cache.SetCacheability(HttpCacheability.Private);
page.Response.Expires = -1;
page.Response.Buffer = true;

page.Response.BinaryWrite(result.DocumentBytes);
page.Response.End();

调用方法一,就好像扩展方法是实例上的一个方法一样

以这种方式调用扩展方法很简单,因为扩展方法是可调用的,就好像它们是它们正在扩展的 class 实例上可用的方法一样。因此,如果您有一个实例,您可以 instance.ExtensionMethod() 而不必将该实例作为调用的参数,因为您正在使用该实例进行调用。

如果您有一个 BasePage 的实例,在一个名为 page 的变量中,您可以这样调用扩展方法:

page.ExportReport();

如果您的 ExportReport 签名中有三个参数,那么您可以这样称呼它:

page.ExportReport(param2, param3);

请注意我是如何将第一个参数移动到方法之前的。

调用方法二,就像调用普通静态方法一样

由于扩展方法是静态方法,你也可以用普通的静态方法调用它们。

因此,如果您有一个名为 pageBasePage 实例(或 BasePage 方法中的 this,您可以这样调用:

Reporting.ExportReport(page, param2, param3)

param2 和 param3 是例子,如果你有额外的参数,你的评论指出。显然,无论你有多少额外参数,都可以使用。

总结

这两种调用方法意味着在 BasePage 方法中您可以通过两种方式调用,因为 BasePage 方法中的 this 将引用 BasePage实例本身:

this.ExportReport(param2, param3);

Reporting.ExportReport(this, param2, param3);

因此,扩展方法将很好地处理您想做的事情,允许看起来像扩展方法的语法是 BasePage 实例上可用的额外方法,或者也允许常规静态调用样式。

但是,您也可以使用常规静态方法,而无需扩展方法的 'syntactic sugar',在这种情况下,签名的第一个参数前面不会有 this。但是这个扩展很好,因为你可以让它看起来像你的 BasePage 上可用的额外方法,并在 BasePage 方法中执行 page.ExportReport 甚至 this.ExportReport