有没有办法将对公共方法的访问限制为仅限于C#中的特定类?

我在C#中有一个带有公共方法的A类。 我想允许只有B类访问此方法。这可能吗?

更新

这就是我想做的事情:

public class Category { public int NumberOfInactiveProducts {get;} public IList Products {get;set;} public void ProcessInactiveProduct() { // do things... NumberOfInactiveProducts++; } } public class Product { public bool Inactive {get;} public Category Category {get;set;} public void SetInactive() { this.Inactive= true; Category.ProcessInactiveProduct(); } } 

我希望其他程序员这样做:

 var prod = Repository.Get(id); prod.SetInactive(); 

我想确保他们不会手动调用ProcessInactiveProduct:

 var prod = Repository.Get(id); prod.SetInactive(); prod.Category.ProcessInactiveProduct(); 

我想允许Category.ProcessInactiveProduct访问仅类Product。 其他类不应该能够调用Category.ProcessInactiveProduct。

将两个类放在单独的程序集中,并将该方法设置为内部。

如果您将类A作为B类中的私有嵌套类,则可以:

 class B { class A { public Int32 Foo { get; set; } } } 

在此示例中,只有B才能看到A及其成员。

或者你可以在A里面嵌套B

 class A { Int32 Foo { get; set; } public class B { } } 

在这种情况下,每个人都可以看到AB但只有B可以看到A.Foo

您可以通过以下方式限制方法/类访问:

 [StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey="…hex…", Name="App1", Version="0.0.0.0")] public class Class1 { } 

有关详细信息,请查看http://msdn.microsoft.com/en-us/library/c09d4x9t.aspx 。

托管代码提供了几种限制方法访问的方法:

  • 限制对指定标识的调用者的方法访问 – 实质上是您选择的任何特定证据(强名称,发布者,区域等)。

您的问题没有开箱即用的答案。

如果它们已经在同一个程序集中,为什么不将该方法设为内部作用域呢?

如果它们位于不同的程序集中,则可以使用涵盖所有内部方法的“ friend ”语法。

可能您最好的解决方案是将公共方法的访问权限限制为特定程序集。 这意味着有人不能只编写一个新程序集并继续调用您的公共方法。 鉴于您似乎有一个域模型,看起来您应该允许从其他域对象调用此方法,但可能不是从业务逻辑调用。 这可以通过为域模型DLL分配唯一的强名称来实现。

您可以限制对公共方法的访问,以仅允许由满足给定公钥的程序集中的方法调用它。 请参阅msdn StrongNameIdentityPermission

您可以使用Observer类型的模式,其中Category注册对Product上的特定事件(可能是ProductInactivated事件?)的兴趣,然后适当地处理逻辑。 这种基于事件的模式非常常见,大大减少了耦合。 该类别最终对其自身状态负责,并且不依赖于产品知道包含它的内容,以保持类别的状态不变。 产品只是告诉感兴趣的客户什么时候发生了事情。

另一种选择是重构您的Category类,使其包含或包含在某个CategoryProductServices对象中,该对象封装了Product在其包含的Category上需要执行的方法。 在创建类别和产品的上下文中,将此CategoryProductServices对象的实例传递给Product而不是完整的Category。 此设计使接口保持公用,但阻止客户端访问服务,因为它们无法检索实例。 它还放松了Products与Category类的紧密耦合,将其限制为只有产品必须知道的那些服务。 这使得产品负责该州,但至少限制了它需要知道/做的事情。