将 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);
请注意我是如何将第一个参数移动到方法之前的。
调用方法二,就像调用普通静态方法一样
由于扩展方法是静态方法,你也可以用普通的静态方法调用它们。
因此,如果您有一个名为 page
的 BasePage
实例(或 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
。
我有一个 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);
请注意我是如何将第一个参数移动到方法之前的。
调用方法二,就像调用普通静态方法一样
由于扩展方法是静态方法,你也可以用普通的静态方法调用它们。
因此,如果您有一个名为 page
的 BasePage
实例(或 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
。