扩展方法如何工作

时间:2013-04-12 08:14:12

标签: c# asp.net extension-methods

我想了解扩展方法是如何工作的?我们可以在非静态类中定义扩展方法吗?

*

  

为什么我们将扩展方法放在静态类中?

*

根据MSDN,

  

**它们的第一个参数指定方法操作的类型,参数前面有this修饰符。扩展方法   只有在您将命名空间显式导入到您的范围内时才在范围内   带有using指令的源代码。

     

**

此处运算符的作用是什么?它如何将该扩展方法与该参数相关联?

4 个答案:

答案 0 :(得分:6)

不,您无法在非静态类上定义扩展方法。

this是语法糖,允许在实例上调用静态扩展方法。但是在一天结束时,扩展方法只不过是静态类中的静态方法。

基本上是这样的:

var test = myInstance.MyExtensionMethod();

相同
var test = MyExtensionClass.MyExtensionMethod(myInstance);

答案 1 :(得分:2)

对于作为扩展方法的方法,它们是4个要求:

  • 必须在静态类
  • 中声明
  • 必须是静态的(如果符合第一个,它实际上总是如此)
  • 必须公开
  • 必须使用this关键字
  • 标记第一个参数

所以你不能在非静态类中定义扩展方法。

整个扩展方法功能是某种语法糖。遵循MyClass上声明的扩展方法:

// The following extension methods can be accessed by instances of any  
// class that is or inherits MyClass. 
public static class Extension
{
    public static void MethodA(this MyClass myInterface, int i)
    {
        Console.WriteLine
            ("Extension.MethodA(this IMyInterface myInterface, int i)");
    }
}

可以通过两种方式调用:

var myClassObject = new MyClass();

Extension.MethodA(myClassObject);

或者

myClassObject.MethodA();

然而,无论如何,第二个将被编译器转换为第一个。

答案 2 :(得分:2)

  

运算符在此处的作用是什么?它与此相关联   该参数的扩展方法?

在此上下文中,this不是运算符,而是一个修饰符。它可能被称为其他东西,它与this对象无关,它引用普通方法调用中的当前对象。

this修饰符的作用是告诉编译器这实际上是一个扩展方法而不是标准的静态方法,所以当你以看起来<的方式调用它时它不会抱怨/ em>就像实例方法调用一样,尽管它不是。

答案 3 :(得分:1)

不,扩展方法必须在静态类中,这只是规则。可以允许在任何地方定义扩展方法,但是为了更容易找到它们,不允许将它们隐藏在具有许多其他代码的类中。

this关键字用于扩展方法的第一个参数,以指定它是扩展方法。

(常规方法的内部实现也将对象引用作为第一个参数,因此编译器对扩展方法的作用只是将它们添加到类中的其他方法。)