C# 通过公共接口访问内部方法 形势

C# 通过公共接口访问内部方法 形势,c#,interface,C#,Interface,假设我有一个具有内部方法的类: class MyClass : IMyClass { public void PublicMethod() { ... } internal void InternalMethod() { ... } } 它实现了一个接口: interface IMyClass { void PublicMethod() { ... } } 以及一个容器类,其中包含MyClass和其他具体类的实例: class ContainerClass {

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

class MyClass : IMyClass
{
    public void PublicMethod() { ... }
    internal void InternalMethod() { ... }
}
它实现了一个接口:

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

class ContainerClass
{
    public MyClass myClass;
    ...
}
集装箱类
由各种组件使用。当在与
MyClass
相同的程序集中使用时,调用方法可以调用
containerClass.MyClass.InternalMethod()


问题 为了使测试更容易模拟,我现在尝试用接口而不是具体的类替换
容器类
的属性,例如:

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

让我们假设我无法更改对该方法的
内部
访问。还有别的办法吗



编辑:这不同于,因为我不是在试图模拟内部方法,而是在用接口(
IMyClass
)替换具体类(
MyClass
)时试图将其公开。

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

public interface IMyClassPublic
{
    void PublicMethod();
}

internal interface IMyClassInternal
{
    void InternalMethod();
}
public class MyClass : IMyClassPublic, IMyClassInternal
{
    public void PublicMethod() {  }
    void IMyClassInternal.InternalMethod() {  }
}
MyClass
中实现这两个函数(因为它是内部的,所以需要显式实现
IMyClassInternal
):

并更改
ContainerClass
,使其分别公开两个接口(并可能使
myClass
私有):


现在您可以模拟这两种方法,使用内部方法作为
containerClass.myClassInternal.InternalMethod()
,使用公共方法作为
containerClass.myClassPublic.PublicMethod()

@elgonzo我的目标不是模拟内部方法(我的测试不要求模拟它)。此问题是由于将具体类
MyClass
替换为接口
IMyClass
:内部方法变得不可见/不可访问,因为它没有通过接口公开。请稍候。。。所以你想模拟MyClass的一部分,而不是模拟MyClass的其他部分?有些事情似乎不合情理,或者我完全误解了你…@elgonzo我可能只是没有很好地解释我自己。问题不在于嘲笑本身。这个问题是在试图使事情更容易模拟时出现的(即通过使用接口的DI,而不是将
ContainerClass
紧密耦合到
MyClass
),因为其他(遗留)代码通过
ContainerClass
的实例调用
MyClass
上的内部方法。啊,好的。你现在明白了。使用抽象基类而不是接口是否可行?基类可以提供(虚拟)内部方法。然后基于这个抽象基类有两个不同的实现;一个普通的“生产类”和另一个用于测试的实现(有或没有对公共和/或内部方法的单独重写)Hmmm,您可能已经了解了其中的一些内容。我现在正在尝试另一种可能的解决方案,但如果不行,我会试试你的。
public class ContainerClass
{
    private MyClass myClass;
    public IMyClassPublic myClassPublic
    {
        get
        {
            return myClass;
        }
    }

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