如何在不使用的情况下调用扩展方法

using System; class Runner { static void Main() { A a = new A(); // how to say a.PrintStuff() without a 'using' Console.Read(); } } class A { } namespace ExtensionMethod { static class AExtensions { public static void PrintStuff(this A a) { Console.WriteLine("text"); } } } 

如何在没有“使用”的情况下调用扩展方法? 而不是ExtensionMethod.AExtensions.PrintStuff(a),因为那不使用扩展方法。

可以像这样直接调用你的扩展,因为它只是一个静态方法,传递它将作为第一个参数的实例:

 A a = new A(); ExtensionMethod.AExtensions.PrintStuff(a); 

如果您按照此模式使用更常用的扩展方法,则可能会对发生在此代码中的其他开发人员造成混淆。 它还会使诸如LINQ之类的链接扩展调用看起来更像是一种函数式语言,因为您将嵌套每个调用而不是链接它们。

如果扩展方法和类A在同一命名空间中,

如果你必须使用不同的命名空间,那么你必须using ,我不认为有一种方法可以不using 。 但是你可以通过将所有扩展放在一个名称空间中using减少使用次数,例如Linq( System.Linq.Extensions

注意:您可以删除Extension方法的命名空间,然后它将使它们全局可用

需要using才能知道函数的位置。 Linq中的一个例子。 如果没有使用System.Linq,您将无法为任何IEnumerable'启用linq

但是,您可以在与调用方相同的命名空间中定义扩展方法,以避免使用。 但是,如果在许多名称空间中需要它,则该方法将不起作用

这让我觉得很脏,但您可以将扩展方法放在System命名空间中。 默认情况下,您的问题包含此命名空间

 using System; class Runner { static void Main() { A a = new A(); // how to say a.PrintStuff() without a 'using' Console.Read(); } } class A { } namespace System { static class AExtensions { public static void PrintStuff(this A a) { Console.WriteLine("text"); } } } 

关于为ExtendableType类型创建扩展方法的反思:

  • 将类命名为ExtendableTypeExtensions
  • 声明扩展类partial,以便客户端可以按照相同的模式添加扩展方法; 和
  • 将扩展方法放在与基类型相同的命名空间中

除非你有充分的理由遵循LINQ的模型:

  • 一大类扩展方法,
  • 这一切都适用于多个基类。

在我们的项目中,扩展名与类扩展名放在同一名称空间中。 你的例子:

 A.cs: using System; namespace ANamespace { class A { } } AExtensions.cs: namespace ANamespace { static class AExtensions { public static void PrintStuff(this A a) { Console.WriteLine("text"); } } } 

现在,当您为ANamespace添加using A类时, A类的所有扩展也将包含在内。