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

cou*_*que 17 c#

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*nLS 18

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

A a = new A();
ExtensionMethod.AExtensions.PrintStuff(a);
Run Code Online (Sandbox Code Playgroud)

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

  • 当您不想导入与已导入的其他名称空间有很多冲突的名称空间时,此方法非常有用。 (2认同)

Dam*_*ith 12

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

如果你必须使用不同的命名空间,那么你必须使用using,我认为没有办法在没有它的情况下做到这一点using.但是你可以using通过将所有扩展放在一个名称空间中来减少数量,例如Linq(System.Linq.Extensions)

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

  • 甚至不知道名称空间不是必需的:) (2认同)

TGH*_*TGH 5

它需要using知道函数的位置.Linq中的一个例子.如果没有System.Linq使用 - 你将不会为你IEnumerable<T>'的任何一个启用linq

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


Dav*_*ell 5

这让我感觉很脏,但是您可以将扩展方法放在 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)