我正在寻找在一个界面中将方法“发布”到另一个界面的方法,但是将其隐藏给其他界面。
我有以下界面
public interface IFirst
{
void Forbidden();
}
public interface ISecond
{
void Test(IFirst first);
}
internal class Second : ISecond
{
void Test(IFirst first)
{
first.Forbidden();
}
}
如您所见,ISecond的实现需要在IFirst上调用'Forbidden'方法。但是,我不希望允许其他程序集中的类在IFirst的实现上调用'Forbidden'。我该怎么做才能从外界隐藏这个方法,但仍然允许ISecond的实现使用它?
答案 0 :(得分:3)
将Forbidden
方法放在另一个非公共接口中:
public interface IFirst
{
// whatever ...
}
internal interface IPrivate : IFirst
{
void Forbidden();
}
public interface ISecond
{
void Test(IFirst first);
}
internal class Second : ISecond
{
void Test(IFirst first)
{
var priv = first as IPrivate;
if (priv != null)
priv.Forbidden();
}
}
答案 1 :(得分:1)
查看internal keyword和internalsvisibleto attribute。结合这些,你应该能够做你想要的。请注意:这适用于装配的所有内部。
答案 2 :(得分:0)
如果您想要接口,我认为您无法做任何事情,就像您希望公共方法ISecond
采用IFirst
参数IFirst
一样必须是公共的,所有方法都必须是公共的,因此IFirst
的用户总是可以调用方法。
您可以测试IFirst
的实现,看看它是否实现了另一个内部接口,但除非您能够控制抛出正在传递的IFirst
的实现,否则不能保证工作(并且即使你控制了实例,也不能保证工作)因为有人总是可以传递一些其他没有实现内部接口的实现。
您可以通过使用抽象基类来实现,但我没有对此进行测试,只是一个想法:
public abstract class FirstBase
{
protected internal abstract void Forbidden();
}
public interface ISecond
{
void Test(FirstBase first);
}
internal class Second : ISecond
{
void Test(FirstBase first)
{
first.Forbidden();
}
}