通过公共接口访问内部方法

时间:2018-03-07 19:05:40

标签: c# interface

情况

假设我有一个内部方法的类:

if (!string.IsNullOrWhiteSpace(corrID?.ID))
{
    context.Response.OnStarting((state) =>
    {
        context.Response.Headers.Add("Correlation-ID", corrID.ID);
        return Task.FromResult(0);
    }, context);
}

await _next(context);
实现接口的

class MyClass : IMyClass
{
    public void PublicMethod() { ... }
    internal void InternalMethod() { ... }
}

一个包含interface IMyClass { void PublicMethod() { ... } } 实例和其他具体类的容器类:

MyClass

class ContainerClass { public MyClass myClass; ... } 由各种程序集使用。在与ContainerClass相同的程序集中使用时,调用方法可以调用MyClass

问题

为了使测试更易于模拟,我现在尝试用接口而不是具体类替换containerClass.myClass.InternalMethod()的属性,例如:

ContainerClass

但是,如果我这样做,class ContainerClass { public IMyClass myClass; ... } 将无法再使用InternalMethod调用,因为该方法在接口上不存在...也不是可以,因为它是containerClass.myClass.InternalMethod()。但是,我无法使接口内部,因为其他程序集也使用internal

假设我无法更改ContainerClass对该方法的访问权限。还有另一种方式吗?

编辑:这与How to Mock the Internal Method of a class?不同,因为我没有尝试模拟内部方法,我试图在替换具体类时将其暴露(internal )带有接口(MyClass)。

1 个答案:

答案 0 :(得分:3)

一个选项是创建两个接口,一个是公共接口,一个是内部接口:

public interface IMyClassPublic
{
    void PublicMethod();
}

internal interface IMyClassInternal
{
    void InternalMethod();
}

MyClass中实现它们(您需要明确地实现IMyClassInternal,因为它是内部的):

public class MyClass : IMyClassPublic, IMyClassInternal
{
    public void PublicMethod() {  }
    void IMyClassInternal.InternalMethod() {  }
}

并更改ContainerClass以便它分别公开两个接口(并且可能使myClass私有):

public class ContainerClass
{
    private MyClass myClass;
    public IMyClassPublic myClassPublic
    {
        get
        {
            return myClass;
        }
    }

    internal IMyClassInternal myClassInternal
    {
        get
        {
            return myClass;
        }
    }
}

现在您可以模拟它们,将内部方法用作containerClass.myClassInternal.InternalMethod(),将公共方法用作containerClass.myClassPublic.PublicMethod()