情况
假设我有一个带有内部方法的类:
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/