如何在不使用的情况下调用扩展方法
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
类的所有扩展也将包含在内。