c# - 通过公共(public)接口(interface)访问内部方法

标签 c# interface

情况

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

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

实现接口(interface):

interface IMyClass
{
    void PublicMethod() { ... }
}

还有一个包含 MyClass 实例的容器类和其他具体类:

class ContainerClass
{
    public MyClass myClass;
    ...
}

ContainerClass被各种程序集使用。当在与 MyClass 相同的程序集中使用时调用方法可以调用containerClass.myClass.InternalMethod()


问题

为了使测试更容易模拟,我现在尝试替换 ContainerClass具有接口(interface)而不是具体类的属性,例如:

class ContainerClass
{
    public IMyClass myClass;
    ...
}

但是,如果我这样做,InternalMethod无法再使用 containerClass.myClass.InternalMethod() 调用因为接口(interface)上不存在该方法...也不不能它,因为它是internal 。但是,我无法将接口(interface)设为内部接口(interface),因为 ContainerClass也被其他程序集使用。

假设我无法更改 internal访问该方法。还有别的办法吗?


编辑:这与 How to Mock the Internal Method of a class? 不同因为我不想模拟内部方法,所以在用接口(interface)( MyClass )替换具体类( IMyClass )时,我试图保持它的公开。

最佳答案

一种选择是创建两个接口(interface),一个公共(public)接口(interface)和一个内部接口(interface):

public interface IMyClassPublic
{
    void PublicMethod();
}

internal interface IMyClassInternal
{
    void InternalMethod();
}

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

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

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

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

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

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

关于c# - 通过公共(public)接口(interface)访问内部方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49159483/

相关文章:

c# - 产品发布改了库名,新旧如何兼容?

delphi - 为什么基于TComponent的接口(interface)实现会泄漏内存?

java - 实现接口(interface)和扫描仪属性

javascript - JQuery 在点击时替换图像

AngularJS 代理指令

java - 为类外部的对象创建自定义方法

c# - 在 C# 中创建时间戳的函数

c# - 如何关闭 Entity Framework 6.0 中特定表的复数化?

c# - SignalR - 在不同的 Redis 背板之间切换

c# - Excel 自动化 : How do I set the range?