5

我第一次尝试创建扩展方法,但遇到了一些麻烦……也许你们可以帮忙:)

public static class Extentions
    {
        public static int myMethod(this MyClass c)
        {
              return 1;
        }
    }

然后当我执行“MyClass.myMethod”时,我得到 q 编译器错误,说该方法不存在......

这是为什么?

4

4 回答 4

19

首先,您需要一个“使用”指令来包含包含您的类和扩展方法的命名空间。

第二 - 重新“MyClass.myMethod” - 扩展方法适用于实例,而不是静态 - 所以你需要:

MyClass foo = ...
int i = foo.myMethod(); // translates as: int i = Extentions.myMethod(foo);

最后——如果你想在内部 MyClass(或子类)使用扩展方法,你需要一个显式的this——即

int i = this.myMethod(); // translates as: int i = Extentions.myMethod(this);

这是少数几个重要的案例之一this

于 2009-03-12T12:51:26.337 回答
6

您是否包含定义扩展的名称空间?我以前就被那个烫伤了。

还有一种方法可以避免必须添加扩展名的命名空间,以便在该命名空间中定义扩展名。虽然这不是一个好习惯

于 2009-03-12T12:47:44.367 回答
5

您是否导入(using开头的子句)哪个Extensions类所在的名称空间?

using Myself.MyProduct.MyNamespace;
于 2009-03-12T12:49:11.867 回答
1

是否有理由强迫您使用扩展方法

如果您无法在原始源中添加方法并且无法使用子类扩展该类(如果已声明sealed) ,则应仅使用扩展方法

扩展方法页面指出:

一般来说,我们建议您谨慎地实施扩展方法,并且仅在必要时才实施。只要有可能,必须扩展现有类型的客户端代码应该通过创建从现有类型派生的新类型来实现。有关详细信息,请参阅继承(C# 编程指南)

这是有关类多态性的更多信息。

如果确实不可能扩展类,那么请遵循有关using指令和实例方法静态方法的其他答案。

于 2009-03-12T13:34:12.040 回答