如何在内部实现扩展方法

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

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

一般来说,引擎盖下会发生什么?

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

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

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

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

澄清上面的答案……扩展方法是静态函数。 .NET 3.5中的附加function允许将它们解释为它们是所讨论类型的新方法。

扩展方法只是静态方法。 唯一的区别是Visual Studio编辑器等工具带来了自动完成(intellisense)function。 你可以在这里找到详细的解释: C#扩展方法:语法糖或有用的工具?

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

你可以读这个

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

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

即使这是引擎盖下发生的事情。

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