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

时间:2010-04-13 13:43:50

标签: c# oop

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

更新

这就是我想做的事情:

public class Category
{
    public int NumberOfInactiveProducts {get;}
    public IList<Product> 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<Product>(id);
prod.SetInactive();

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

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

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

5 个答案:

答案 0 :(得分:18)

将两个类放在一个单独的程序集中,并使该方法处于内部。

答案 1 :(得分:2)

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

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

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

或者,您可以在B内嵌套A

class A
{
    Int32 Foo { get; set; }

    public class B { }
}

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

答案 2 :(得分:1)

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

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

请点击此处http://msdn.microsoft.com/en-us/library/c09d4x9t.aspx了解详情。

  

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

     
      
  • 限制对指定身份的呼叫者的方法访问权限 - 实质上是您选择的任何特定证据(强名称,发布者,区域等)。
  •   

答案 3 :(得分:0)

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

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

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

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

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

答案 4 :(得分:0)

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

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