【问题标题】:C# Give access to specific unrelated classC# 授予对特定不相关类的访问权限
【发布时间】: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;} 吗?

标签: c# properties xna access-modifiers


【解决方案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 的替代品。
    • 是的,这就是我最终所做的。我打算更改链接,但没有时间编辑评论。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    相关资源
    最近更新 更多