引用自定义C#扩展方法的编译器错误

时间:2009-03-12 12:46:38

标签: c# extension-methods

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

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

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

为什么?

4 个答案:

答案 0 :(得分:19)

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

第二 - 重新“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很重要的少数案例之一。

答案 1 :(得分:6)

您是否包含定义扩展名的命名空间?我之前已被烧过。

这是一种绕过必须添加扩展名的命名空间来定义该命名空间中的扩展名的方法。这不是一个好习惯

答案 2 :(得分:5)

您是否在using类的名称空间中导入了Extensions子句?

using Myself.MyProduct.MyNamespace;

答案 3 :(得分:1)

是否有理由强迫您使用Extension methods

如果您不能在原始源中添加方法并且无法使用子类扩展该类(如果它被声明为sealed),那么您应该只使用扩展方法

扩展方法的页面说明:

  

一般情况下,我们建议你   谨慎地实施扩展方法   只有当你必须。每当   可能的,必须扩展的客户端代码   现有类型应该通过   创建一个派生自的新类型   现有类型。欲获得更多信息,   见Inheritance (C# Programming Guide)

以下是有关classespolymorphism的更多信息。

如果真的无法扩展课程,那么请遵循关于using指令和实例methods vs static methods的其他答案。