部分隐藏外部程序集的接口方法

时间:2011-10-11 08:53:33

标签: c# interface access-modifiers

我正在寻找在一个界面中将方法“发布”到另一个界面的方法,但是将其隐藏给其他界面。

我有以下界面

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的实现使用它?

3 个答案:

答案 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 keywordinternalsvisibleto 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();
  }
}