如何确保类可以在另一个类上调用方法,但其他类不能调用该方法?

Jim*_*ell 6 c#

我有两个类,我想保留在单独的文件中.

namespace GridSystem
{
    public class Grid
    {
        public void AddItem(GridItem item)
        {
            item.InformAddedToGrid();
        }
    }
}

namespace GridSystem
{
    public class GridItem
    {
        public void InformAddedToGrid()
        {
            Debug.Log("I've been added to the grid");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何确保不允许其他类调用InformAddedToGrid?

我正在尝试模拟Actionscript命名空间,它可以在方法上使用,代替公共,私有,内部等.它并不完全保护方法,但强制在方法之前包含命名空间的额外步骤被访问.在C#中有替代方法吗?

TGH*_*TGH 5

如果GridItem本身也可以从外部世界隐藏,我会考虑将GridItem作为嵌套类放在Grid中.这样,它就不会在课堂外看到

http://www.codeproject.com/Articles/20628/A-Tutorial-on-Nested-Classes-in-C


Kei*_*las 1

并不是说您应该这样做,您应该按照 TGH 的建议进行操作,为 GridItem 有一个公共接口,并将 gridItem 嵌套在 Grid 中(然后在 Grid 上有一个工厂方法来创建 Items 并使用部分 Grid 类将它们放在单独的文件中) 。

因为没有办法拥有友元方法(您可以通过进行友元类InternalsVisibleToAttribute

可以这样做(但不要......)

public partial class Grid
{
   public void AddItem(GridItem item)
   {
      item.InformAddedToGrid();
   }
}        

public class GridItem
{
   public void InformAddedToGrid()
   {                
      if (new StackTrace().GetFrame(1).GetMethod().DeclaringType != 
                   typeof(Grid)) throw new Exception("Tantrum!");
      Console.WriteLine("Grid called in...");

   }
}
Run Code Online (Sandbox Code Playgroud)

然后

 var g = new Grid();
 g.AddItem(new GridItem()); // works
 new GridItem().InformAddedToGrid(); // throws a tantrum...
Run Code Online (Sandbox Code Playgroud)