25
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),因为它没有使用扩展方法。

4

7 回答 7

28

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

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

如果您遵循此模式来获取更常用的扩展方法,这可能会让其他在此代码中发生的开发人员感到困惑。它还会使链接扩展调用(如 LINQ)看起来更像是一种函数式语言,因为您将嵌套每个调用而不是链接它们。

于 2014-12-17T23:36:11.833 回答
13

如果扩展方法和类 A 在同一个命名空间中,这是可能的,

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

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

于 2013-07-24T03:18:37.330 回答
5

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

但是,您可以在与调用者相同的命名空间中定义扩展方法,以避免放入 using。但是,如果在许多命名空间中都需要这种方法,它将不起作用

于 2013-07-24T03:16:55.403 回答
4

这让我觉得很脏,但是您可以将扩展方法放在 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");
        }
    }
}
于 2013-07-24T03:44:07.870 回答
2

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

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

除非您有充分的理由遵循LINQ之类的模型:

  • 大量的扩展方法,
  • 这都适用于多个基类。
于 2013-07-24T04:18:14.120 回答
1

您可以添加没有命名空间的扩展方法。这将影响整个系统,这是不推荐的。

public static class StringExtensions
{       
    public static void HelloWorld(this String s)
    {
        Console.Write("Hello World");
    }
}



    string str = "s";
    str.HelloWorld();
于 2019-12-06T06:45:42.913 回答
0

在我们的项目中,扩展被放置在与类扩展相同的命名空间中。你的例子:

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");
        }
    }
}

现在,当您添加usingANamespace 以使用A该类时,该类的所有扩展A也将包括在内。

于 2013-07-24T05:09:19.297 回答