为什么这个函数必须是静态的?

时间:2012-09-01 16:21:40

标签: c#

public void AppendText(this RichTextBox box, string text, Color color)
{
    box.SelectionStart = box.TextLength;
    box.SelectionLength = 0;

    box.SelectionColor = color;
    box.AppendText(text);
    box.SelectionColor = box.ForeColor;
} 

public static void

但是我在Form1中的这一行有一个错误:

public partial class Form1 : Form

错误在Form1上说:

  

错误扩展方法必须在非泛型静态类中定义

如果我从函数中删除静态,我会在AppendText上获取错误:

  

错误扩展方法必须是静态的

我如何使用它?

2 个答案:

答案 0 :(得分:3)

因为它在RichTextBox上是extension method,所以它需要是静态的,也需要在静态类中。

方法参数中的

this关键字将其定义为RichTextBox

上的扩展方法
AppendText(this RichTextBox box.......

来自MSDN - Extension Methods

  

扩展方法被定义为静态方法,但是被调用   使用实例方法语法。它的第一个参数指定方法操作的类型,参数前面是 this 修饰符。

来自MSDN - this keyword

  

this关键字引用类的当前实例,并且是   也用作扩展名的第一个参数的修饰符   方法

如果要在RichTextBox上创建扩展方法,则必须将此方法定义为静态,并将其置于静态非泛型类中,如:

public static class MyExtensions
{
   public static void AppendText(this RichTextBox box, string text, Color color)
   {
    box.SelectionStart = box.TextLength;
    box.SelectionLength = 0;

    box.SelectionColor = color;
    box.AppendText(text);
    box.SelectionColor = box.ForeColor;
   } 
}

以后你可以这样称呼:

RichTextBox yourRichTextBox = new RichTextBox();
yourRichTextBox.AppendText("Some Text",Color.Blue);

答案 1 :(得分:2)

第一个参数之前this关键字的存在是defining extension methods

public void AppendText(this RichTextBox box, string text, Color color)
//                     ^^^^

扩展方法必须在静态类中。

删除this关键字,使其成为普通方法。