c# - 扩展方法在内部是如何实现的

标签 c# .net clr

内部如何实现扩展方法?我的意思是当编译器看到扩展方法的声明时会发生什么,以及当调用扩展方法时在运行时会发生什么。

是否涉及反射?或者当你有一个扩展方法时,它的代码是否被注入(inject)到目标类类型元数据中,并带有一些额外的标志,指出这是一个扩展方法,然后 CLR 知道如何处理它?<​​/p>

那么一般来说,幕后会发生什么?

最佳答案

正如其他同事所说,它只是一个静态方法。 一切都与编译器有关,我们可以说 CLR 甚至不知道扩展方法。 您可以尝试检查 IL 代码..

这是一个例子

static class ExtendedString
{
    public static String TestMethod(this String str, String someParam)
    {
        return someParam;
    }
}

static void Main(string[] args)
{
    String str = String.Empty;
    Console.WriteLine(str.TestMethod("Hello World!!"));
    ........
}

这是 IL 代码。

  IL_0001:  ldsfld     string [mscorlib]System.String::Empty
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  ldstr      "Hello World!!"
  IL_000d:  call       string StringPooling.ExtendedString::TestMethod(string,
                                                                       string)
  IL_0012:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0017:  nop

如你所见,它只是一个静态方法的调用。 该方法未添加到类中,但编译器使其看起来像那样。 在反射层,您可以看到的唯一区别是添加了 CompilerServices.ExtensionAttribute。

关于c# - 扩展方法在内部是如何实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6543827/

相关文章:

c# - 如何使用 Umbraco 7 在事务中执行内容更新?

c# - 嵌套多映射Dapper分页查询中的重复字段名问题

events - F# 中无需装箱的多参数事件类型

c# - CLR 是如何进行内存管理的

python - BOO 与 IronPython

c# - 在 C#/.NET 中将字符串转换为整数

c# - 使用 DTW 算法跟踪鼠标移动

c# - 将 IAsyncEnumerable 转换为列表

C# 等待 TCP 响应的良好实践

c# - 当用户在 wpf 中将鼠标悬停在它上面时,我如何突出显示它?