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;
}
}
}