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),因为那不使用扩展方法。
答案 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>'
但是,您可以在与调用者相同的命名空间中定义扩展方法,以避免使用。但是,如果在许多名称空间中需要这种方法
,这种方法将无效答案 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 创建扩展方法的反思:
除非你有充分的理由遵循 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();