如何在内部实现扩展方法

时间:2011-07-01 05:13:17

标签: c# .net clr

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

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

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

7 个答案:

答案 0 :(得分:7)

正如其他同事已经说过的那样,它只是一种静态的方法。 关于编译器,我们可以说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。

答案 1 :(得分:4)

扩展方法被转换为静态函数。换句话说,它们是静态函数的语法糖。

答案 2 :(得分:2)

我不认为reflection涉及扩展方法。扩展方法的处理方式与在static helper function中编写helper class的方式相同,唯一的区别是编译器会为您执行此操作。

答案 3 :(得分:1)

澄清上述答案......扩展方法是静态函数。 .NET 3.5中的其他功能允许将它们解释为它们是所讨论类型的新方法。

答案 4 :(得分:0)

扩展方法只是静态方法。唯一的区别是Visual Studio编辑器等工具带来了自动完成(intellisense)功能。您可以在此处找到详细说明:C# Extension Methods: Syntactic Sugar or Useful Tool?

答案 5 :(得分:0)

扩展方法与static方法非常相似,唯一的区别在于它具有属性CompilerServices.ExtensionAttribute,这有助于将其标识为扩展方法。

你可以read this

答案 6 :(得分:0)

是的,扩展方法只是静态方法。对于他们认为“扩展”的类,他们没有额外的特权。但是,编译器使用ExtensionAttribute标记“扩展”静态方法。您可以在IL中看到这一点。这使编译器特别对其进行处理,因此您实际上无法将其作为常规静态方法调用。例如,这不会编译:

var test = new [] { "Goodbye", "Cruel", "World" };
var result = IEnumerable<string>.Where<string>(test, s => s.Length > 5);

即使这是发生在幕后的事情。

但正如LukeH在下面所说,你可以在实际定义的类上调用它......傻傻的我。