扩展方法如何挂钩

She*_*Pro 10 .net c#

我只是想知道如何将Extension方法连接到Original类.我知道在IL代码中它调用了静态方法,但它是如何做到的,为什么不打破封装.

Ode*_*ded 16

他们没有"勾结".

Visaul Studio IDE只是通过在intellisense列表中显示它们来使它看起来像它.

编译器"知道"如何处理引用,以便使用正确的参数进行正确的方法调用.

这只是语法糖 - 这些方法只是一个单独的静态类上的静态方法.使用this修饰符可让编译器"知道"将ExtensionAttribute类添加到类中以将其标记为扩展方法.

由于扩展方法实际上不会更改类并且只能访问其上的公共成员,因此保留了封装.

来自MSDN:

扩展方法是一种特殊的静态方法,但他们被称为好像他们是在扩展类型实例的方法.

(强调我的)


Bry*_*tts 9

通过将this关键字放在静态方法的第一个参数前面来指定扩展方法:

public static void SomeExtension(this string s)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这只是用System.Runtime.CompilerServices.ExtensionAttribute修饰方法的语法糖:

[Extension]
public static void SomeExtension(string s)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

当编译器看到该属性时,它知道将扩展方法调用转换为适当的静态方法调用,并将该实例作为第一个参数传递.

由于调用只是普通的静态方法调用,因此没有机会破坏封装; 与所有静态方法一样,这些方法只能访问扩展类型的公共接口.