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

时间:2013-07-24 03:15:12

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

如果没有'使用',我将如何调用扩展方法?而不是ExtensionMethod.AExtensions.PrintStuff(a),因为那不使用扩展方法。

7 个答案:

答案 0 :(得分:16)

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

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

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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:5)

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

启用linq

但是,您可以在与调用者相同的命名空间中定义扩展方法,以避免使用。但是,如果在许多名称空间中需要这种方法

,这种方法将无效

答案 3 :(得分:3)

这让我觉得很脏,但您可以将扩展方法放在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");
        }
    }
}

答案 4 :(得分:2)

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

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

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

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

答案 5 :(得分: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");
        }
    }
}

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

答案 6 :(得分:0)

您可以添加不带名称空间的扩展方法。 这会影响整个系统,因此不建议这样做。

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



    string str = "s";
    str.HelloWorld();