4

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

*

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

*

根据 MSDN,

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

**

这个操作符在这里的作用是什么,它如何将该扩展方法与该参数相关联?

4

4 回答 4

7

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

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

所以基本上:

var test = myInstance.MyExtensionMethod();

是相同的

var test = MyExtensionClass.MyExtensionMethod(myInstance);
于 2013-04-12T08:16:12.447 回答
2

这个操作符在这里的作用是什么,它如何将该扩展方法与该参数相关联?

在这个上下文this中不是一个操作符,它是一个修饰符。this它可能被称为其他东西,它与在正常方法调用中引用当前对象的对象无关。

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

于 2013-04-12T08:26:06.573 回答
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();

但是,无论如何,第二个将由编译器转换为第一个。

于 2013-04-12T08:22:10.860 回答
1

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

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

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

于 2013-04-12T08:24:30.677 回答