C# 授予对特定不相关类的访问权限

Posted

技术标签:

【中文标题】C# 授予对特定不相关类的访问权限【英文标题】:C# Give access to specific unrelated class 【发布时间】:2014-04-21 21:49:46 【问题描述】:

有没有办法修改某些属性对特定类的访问?更具体地说,我想创建一个具有公共获取但只能由某个类设置的属性。

例子:

public Class1

    Class2.SomeInt = 5;


public static Class2

    private static int someInt;
    public static int SomeInt
    
        get  return someInt; 
        (give access to Class1 only somehow?) set  someInt = value; 
    

更新(更多信息): 我在 xna 中这样做,我希望主类型(Game1)是唯一可以修改静态帮助器类的东西。这是针对学校的一个小组项目,我们使用的是 SVN(不确定这有什么关系),我可以告诉小组中的每个人避免设置值,但我想知道是否有更好的方法。

【问题讨论】:

您必须将一个类嵌套在另一个类中才能使其工作。 如果我将 Class2 嵌套在 Class1 中,我应该如何从其他类访问它?我需要 Class1 的实例还是需要说 Class1.Class2.SomeInt? 你想用这个实现什么?可能有一种更简单的方法可以满足您的需求。 不设置该类的属性怎么样?为什么要阻止它?谁是你班级的消费者,你还是其他人? 至少你的示例代码有什么阻止你在 Class1 内声明 static int SomeInt get; private set; 吗? 【参考方案1】:

这在 C# 中似乎是不可能的。您只能使用publicprotectedprotected internalinternalprivate 访问修饰符。 但是,例如,您可以创建一个只包含这两个类的程序集,并为 SomeInt 设置器设置 internal 修饰符,或者将一个类嵌套到另一个类中。 如果您只想从 IntelliSense 中隐藏一个 setter,您可以在某个接口中定义此 setter 并显式实现它:

public interface IHidden<T>

    T HiddenPropery  set; 


public class SomeClass : IHidden<int>

    private int someInt;
    public int HiddenPropery
    
        get  return someInt; 
    

    int IHidden<int>.HiddenPropery
    
        set  someInt = value; 
    

用法:

// This works:
((IHidden<int>)new SomeClass()).HiddenPropery = 1;
// This doesn't:
new SomeClass().HiddenPropery = 1;

【讨论】:

【参考方案2】:

这听起来像 friend 访问修饰符,而 C# 没有。我在 C# 中看到的最接近这一点的是让“不相关”的类成为一个接口,并在一个类中拥有一个私有实现。像这样的:

public interface IWidget

    void DoSomethingPublic();


public class SomeObject

    private ObjectWidget _myWidget = new ObjectWidget();
    public IWidget MyWidget
    
        get  return _myWidget; 
    

    private class ObjectWidget
    
        public void DoSomethingPublic()
        
            // implement the interface
        

        public void DoSomethingPrivate()
        
            // this method can only be called from within SomeObject
        
    

SomeObject 外部的代码可以与MyWidget 交互并查看IWidget 接口上的任何内容,但SomeObject 内部的代码也可以非接口MyWidget 上的公共成员。

【讨论】:

知道我正在寻找的是一个“朋友”访问修饰符,我做了一些研究并找到了StrongNameIdentityPermission。我仍在阅读它以查看是否可以使用它,但如果可行,我将检查此答案是否为我使用的答案 @user3390855:您还可以查看程序集的 InternalsVisibleTo 指令。它可能很容易导致几个程序集比其他方式更紧密地耦合,但在某些情况下可能会起到作用,允许您使用 internal 作为friend 的替代品。 是的,这就是我最终所做的。我打算更改链接,但没有时间编辑评论。感谢您的帮助。

以上是关于C# 授予对特定不相关类的访问权限的主要内容,如果未能解决你的问题,请参考以下文章

仅授予对特定 Azure 存储容器的访问权限

授予特定用户对特定(多个)文档的访问权限

ASP.NET 登录以授予对特定类型人群的访问权限

S3 存储桶策略授予/限制对特定联合用户的访问权限

仅使用一个特定变量授予对仪表板的访问权限

如何授予对 nGinx 中 GeoIP [国家] 阻止的特定 IP 地址的访问权限?