包括接口内的扩展方法

时间:2016-08-23 14:23:54

标签: c# .net unit-testing nunit

当从具体类中抽象出一个接口时,接口是否应该包含扩展方法?上下文专门用于易于单元测试。

3 个答案:

答案 0 :(得分:0)

如果某个课程取决于SomeOtherClass,并且它取决于SomeOtherClass的实例成员静态成员,那么您可以

  • 将静态成员更改为可以作为接口一部分的实例成员
  • 将静态成员放在单独的扩展类(或其他依赖项)中,以便可以用接口替换SomeOtherClass

通过使用依赖项的实例和静态成员,它实际上成为一个中的两个依赖项。您依赖于对象(实例成员)和对象的类型(静态成员)。

如果类本身需要这些方法才能运行,那么它们应该是该类的成员。如果需要它们以便其他类以超出该类职责的方式使用该类(比如将类映射到其他类的方法),那么我将其分离出来。

如果方法都是 - 类需要并且其他类需要,那么你可以将它分成另一个类,原始类和其他类都可以依赖它。

答案 1 :(得分:0)

没有。你有一些问题。首先,接口仅描述公共实例方法的签名(即它们可能没有实现,您可能没有在接口中指定静态方法)。扩展方法必须在编译时具有实现,并且它们不是实例方法,它们是静态方法。请注意,根据documentation

  

在您的代码中,您使用实例方法调用扩展方法   句法。但是,由中间语言(IL)生成   编译器将您的代码转换为静态方法的调用。

换句话说,它不是真正的实例方法(即使你可以像对待它一样); “引擎盖下”它仍然是一种静态方法。

此外,必须在静态类中定义扩展方法(有关如何实现扩展方法,请参阅Microsoft的instructions)。

请注意,可以在接口上使用扩展方法;没有要求你扩展的类型具体。例如:

public static class Class2
{
    public static void Extension(this ITestInterface test)
    {
        Console.Out.WriteLine("This is allowed");
    }
}

现在,当我实例化一个实现ITestInterface接口的具体类时,我可以在其上调用扩展方法:

// "Test" is some class that implements the ITestInterface interface
ITestInterface useExtensionMethod = new Test();
useExtensionMethod.Extension();

这可以做你想要的。

答案 2 :(得分:0)

举例来说,对于以下两个类:

class SomeClass
{
    public Prop1 { get; }
    public void Method1() { .... }
}

static class SomeExtensions
{
    public static ExtensionMethod(SomeClass this sc) { ... }
}

正如其他人所说,在创建界面时,您仅限于SomeClass中的公共非静态成员,但是,还需要修改扩展方法来引用界面,而不是同时具体的类型:

static class SomeExtensions
{
    public static ExtensionMethod(ISomeClass this sc) { ... }
}