如何编译扩展方法?

alf*_*dev 8 c# .net-3.5

C#编译器如何实现扩展方法?

Ste*_*fan 6

该过程与重载决策完全相同:

Func(myObject);
Run Code Online (Sandbox Code Playgroud)

编译器检查名为"Func"的所有函数,并尝试将myObject的静态类型与参数匹配(可能使用转换,向上转换为基类).如果成功,则调用适当的函数.

如果您意识到可以"以正常方式"调用扩展方法,那么它会清除:

static class MyExtensions
{
    public static void MyFunc(this string arg)
    {
        // ...
    }
}

string a = "aa";
MyExtensions.MyFunc(a); // OK
a.MyFunc();             // same as above, but nicer
Run Code Online (Sandbox Code Playgroud)

对于给定的类型(此处为字符串),编译器只在第一个参数上查找所有带有"this"修饰符的静态函数,并尝试匹配左侧的静态类型.(在此示例中为"a"),函数中包含参数类型.